计算方法 实验四 解线性方程组的迭代法

一,问题的提出

对实验四所列目的和意义的线性方程组,试分别选用Jacobi迭代法,Gauss-Secidol迭代法和SOR方法计算其解.

二,要求

1,体会迭代发求解线性方程组,并能与消去法做比较
2,分别对不同精度,体会该迭代法的收敛快慢.
3,对方程组2,3使用SOR方法时,选取松弛因子,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;
4,给出各种算法的设计程序和计算结果

三,目的和意义

1,通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较,
2,运用所学的迭代算法,解决各类线性方程组,编出算法程序;

四,代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <math.h>
using namespace std;
const int maxn=3;
int main()
{
    double a[maxn][maxn]= {{10,-1,2},{-1,10,-2},{-1,-1,5}};
    double b[maxn]= {7.2,8.3,4.2};
    double x[maxn]= {0,0,0},y[maxn],s,Max,eps=0.00000000001;
    int k=1;
   while(k<100)                                                //循环迭代200次,判断是否收敛
    {
        Max=0;
        for(int i=0; i<maxn; i++)
        {
            int sum=0;
            for(int j=0; j<maxn; j++)
                if(i!=j)
                    sum+=a[i][j]*x[j];                          //求出方程式左边之和
                y[i]=(b[i]-sum)/a[i][i];                        //新迭代出来的x的值
        }
        for(int i=0; i<maxn; i++)
            if(Max<fabs(y[i]-x[i]))                             //循环求出所有x的精确度(Max存最大的精确度)
                Max=fabs(y[i]-x[i]);
        if(Max<eps) break;                                      //最大的精确度都小于要求的精确度满足条件退出循环
        printf("\nk=%d,  ",k);
        for(int i=0; i<maxn; i++)
            printf("y[%d]=%lf ",i,y[i]);
            k++;
        for(int i=0;i<maxn;i++)
            x[i]=y[i];                                          //更新x的值重新迭代
    }
    if(k==100)
        printf("ERROR!\n");
    printf("\nk=%d,  ",k);
    for(int i=0; i<maxn; i++)
    printf("y[%d]=%lf ",i,y[i]);                               //输出迭代出的x
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值