bk12333 2020-10-01 07:31 采纳率: 100%
浏览 61
已采纳

我想知道怎么做一个可以停止送代误差的公式,并且带入回我先有的代码li 当用户输入0。001 的时候我的jacobi和gauss seidel 可以自动迭代到指定的数字位置?

我想知道怎么做一个stopping error 当用户输入0。001 的时候我的jacobi和gauss seidel 可以自动迭代到指定的数字位置。

#include
#include
#include
#include
using namespace std;

double max(float n[], float m[], int p) //这是我打算拿来算送代的误差的东西。
{
double max_ = abs(n[0] - m[0]);
for (int i = 1; i < p; i++)
if (abs(n[i] - m[i]) > max_)
max_ = abs(n[i] - m[i]);
return max_;
}

int main(void) {

float a[100][100], b[100], m[100], n[100], z[100], D[100];
int p = 0, q = 0, i = 0, j = 0, g = 0;
// read from text file
int c;
cout << "Enter the how many eqation you want to solve : "; // 你的matrix的大小 类似3x4
cin >> p;
cout << "enter 1 for open the text file, enter 2 for enter your matrix : ";//你想要选择你用file的东西还是输入你的matrix
cin >> c;
if (c ==1)// 打开文档读取数据
{
    ifstream file;
    file.open("input.txt");
    for (i = 0; i < p; i++) {
        for (j = 0; j < p; j++) {
            file >> a[i][j];
            cout << "a[" << i << ", " << j << " ]=" << a[i][j] << "\n";
        }
    }
    cout << "\nvalues to the right side of equation\n";
    for (i = 0; i < p; i++) {
        file >> b[i];
        cout << "b[" << i << ", " << j << " ]=" << b[i] << "\n";
    }
    cout << "\n";
    file.close();
}
else if(c==2){// 手动输入自己的matrix// 你的左边的matrix
    for (i = 0; i < p; i++) {
        for (j = 0; j < p; j++) {
            cout << "a[" << i << ", " << j << " ]=";
            cin >> a[i][j];
        }
    }
    cout << "\nEnter values to the right side of equation\n";
    for (i = 0; i < p; i++) {
        cout << "b[" << i << ", " << j << " ]=";
        cin >> b[i];
    }// 你的右边的数字。 类似你的答案。 向 3x-y+z= 4 。你的4就是你右边的数字
}
cout << "Enter initial values of gauss iteration\n";
for (i = 0; i < p; i++) {
    cout << "x:[" << i << "]=";
    cin >> m[i];
}//起始数字 guass seidel 的 送代起始点
cout << "Enter initial values of jocobi iteration\n";
for (i = 0; i < p; i++) {
    cout << "x:[" << i << "]=";
    cin >> z[i];
}//起始数字 jacobi 的 送代起始点
cout << "\nEnter the no. of gauss iteration  :";
cin >> q;// 这是不需要的部分。 我现在想实现用户输入一个误差位置然后自动送代一直到用户输入的误差位置/超过50自动停止送代
cout << "\nEnter the no. of  jacobi iteration :";
cin >> g;// 同上
cout << "\ngauss iteration \n";// 这下面是我的gauss seidel的送代方法
        while (q > 0) {
            for (i = 0; i < p; i++) {
                n[i] = (b[i] / a[i][i]);
                for (j = 0; j < p; j++) {
                    if (j == i)
                        continue;
                    n[i] = n[i] - ((a[i][j]) / a[i][i] * m[j]);

                    m[i] = n[i];
                }
                cout << "x" << i + 1 << "=" << n[i] << " ";
            }
            cout << "\n";
            q--;
        }
            cout << "\njocobi iteration \n";
            while (g > 0) {// 这下面是我的jacobi的送代方法
                for (i = 0; i < p; i++) {
                    n[i] = (b[i] / a[i][i]);
                    for (j = 0; j < p; j++) {
                        if (j == i)
                            continue;
                        n[i] = n[i] - ((a[i][j]) / a[i][i] * z[j]);;
                    }
                }
                for (i = 0; i < p; i++) {
                    z[i] = n[i]; printf("x%d = %f ", i + 1, z[i]);
                }
                cout << "\n";
                g--;
            }

        system("pause");
    return 0;

}
现在没有报错,只是我没有办法把我的方程式(算误差的)放进我的公式里面。

  • 写回答

3条回答 默认 最新

  • Cpp权哥 2020-10-01 14:48
    关注
    float diff=0.001;//输入允许的迭代停止误差
    float oldval;
    int OK = 0;//误差达标了吗
    cout << "\ngauss iteration \n";// 这下面是我的gauss seidel的送代方法
            while (q > 0 && !OK) {
                OK = 1;//假设这次迭代能达标
                for (i = 0; i < p; i++) {
                    oldval = n[i];//记录迭代前的值
                    n[i] = (b[i] / a[i][i]);
                    for (j = 0; j < p; j++) {
                        if (j == i)
                            continue;
                        n[i] = n[i] - ((a[i][j]) / a[i][i] * m[j]);
                        m[i] = n[i];
                    }
                    cout << "x" << i + 1 << "=" << n[i] << " ";
                    if (fabs(n[i] - oldval) > diff)
                          OK = 0;//发现误差还不达标的项
                }
                cout << "\n";
                q--;
            }
    
    

    另一个迭代也类似这样改。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘