雅可比迭代求解线性方程组(MPI),输入参数后报错,请问要怎么改
#include <mpi.h>
#include <iostream>
#include <cmath>
#include <iomanip>
#define MAXSIZE 100
using namespace std;
int main(int argc, char** argv) {
int size, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
double A[MAXSIZE][MAXSIZE], x[MAXSIZE], b[MAXSIZE], re[MAXSIZE];
int n;
double e;
int count = 0;
if (rank == 0) {
cout << "请输入原方程的阶数:";
cin >> n;
cout << "请输入原方程的增广矩阵:";
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> A[i][j];
}
cin >> b[i];
}
cout << "请输入初始迭代向量值";
for (int i = 0; i < n; ++i) {
cin >> x[i];
}
cout << "请输入误差上限";
cin >> e;
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Bcast(&e, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Bcast(A, n * MAXSIZE, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Bcast(b, n, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Bcast(x, n, MPI_DOUBLE, 0, MPI_COMM_WORLD);
int rows_per_process = ceil(1.0 * n / size);
int rows = min(rows_per_process, n - rank * rows_per_process);
int start_row = rank * rows_per_process;
MPI_Barrier(MPI_COMM_WORLD);
while (true) {
double local_max_err = 0.0;
for (int i = start_row; i < start_row + rows; ++i) {
re[i] = 0;
for (int j = 0; j < n; ++j) {
if (i != j) {
re[i] += -A[i][j] * x[j];
}
}
re[i] = (re[i] + b[i]) / A[i][i];
local_max_err = max(local_max_err, fabs(x[i] - re[i]));
}
MPI_Allreduce(MPI_IN_PLACE, &local_max_err, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
MPI_Allgather(&re[start_row], rows, MPI_DOUBLE, &x[0], rows, MPI_DOUBLE, MPI_COMM_WORLD);
++count;
if (local_max_err < e) break;
}
if (rank == 0) {
cout << "迭代次数:" << count << endl;
cout << "解向量为:";
for (int i = 0; i < n; ++i) {
cout << setprecision(4) << x[i] << " ";
}
cout << endl;
}
MPI_Finalize();
return 0;
}
本次回答借鉴于GPT4
cin >> n;
if (n > MAXSIZE) {
cout << "阶数过大,超出范围!" << endl;
return -1;
}
cin >> A[i][j];
if (!cin) { // 如果上次输入发生错误
cin.clear(); // 清除错误状态
cin.ignore(1024, '\n'); // 忽略输入缓冲区中输入的非数字字符
cout << "请输入数字:";
}
cin >> e;
if (e <= 0) {
cout << "请输入正数误差上限:";
}
MPI_Init(&argc, &argv);
// ...
MPI_Finalize();
除此之外,还应检查矩阵是否可逆,输入的初值是否适当等。这些因素都可能导致迭代难以收敛或产生异常。
不知道你这个问题是否已经解决, 如果还没有解决的话:buf | counter | datatype | dest | tag | comm |
---|---|---|---|---|---|
发送缓冲区的起始地址,可以是数组或结构指针 | 非负整数,发送的数据个数 | 发送数据的数据类型 | 整型,目的的进程号 | 整型,消息标志 | MPI进程组所在的通信域 |
将发送缓冲区buf中的counter个datatype类型的数据发送到dest目的进程,本次发送的消息标志是tag(用于和MPI_Recv tag 匹配)
6.MPI_Recv(buf,count,datatype,source,tag,comm,status);
buf | counter | datatype | source | tag | comm | status |
---|---|---|---|---|---|---|
接收缓冲区的起始地址,可以是数组或结构指针 | 非负整数,可接收的数据个数 | 接收数据的数据类型 | 整型,发送源进程号 | 整型,消息标志 | MPI进程组所在的通信域 | 返回状态 |
MPI_Recv(&buf, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
可以用于接收任意源,任意tag的消息.
status是MPI定义的一个数据类型,返回状态变量
statusstatus.MPI_SOURCE | status.MPI_TAG | status.MPI_error |
---|