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 Linux环境下CA证书更新问题
  • ¥60 微信小程序如何上传QQ聊天文件
  • ¥300 开发的系统遭到无良商家的破解,请问如何防止再次发生,并追回损失
  • ¥15 java代码写在记事本上后在cmd上运行时无报错但又没生成文件
  • ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
  • ¥15 PPOCRLabel
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 安卓OpenCV人脸识别分类器加载
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)