(20200331)Jacobi迭代(C语言)

参考:

【1】https://blog.csdn.net/sinat_32602421/article/details/83475549

// jacobi.c ://雅克比迭代算法
#define _CRT_SECURE_NO_WARNINGS
#include<math.h>
#include<stdio.h>
#include<stdlib.h>

#define dim 10


//Jacobi迭代法为整体代换法,n为系数矩阵A的阶数,b为右端常向量,x0为迭代初始值,
//   A(n×n)*x0(n×1)=b(n×1)
//MaxNum为最大迭代次数,方程组的解返回在数组x1。
void Jacobi(int n, long double a[dim][dim], long double b[dim], long double x0[dim], int MaxNum, long double *x1)
{
	//  n=dim+1;
	int i, j, k;
	long double sum;
	FILE *fp;

	//打开名为result的文本文件
	fp = fopen("result.txt", "w");

	//把迭代初始值输入到result中
	for (i = 1; i <= n; i++)
	{
		fprintf(fp, "%1.12Lf   ", x0[i]);
		//换行
	}
	fprintf(fp, "\n");

	for (k = 1; k <= MaxNum; k++)
	{
		//Jacobi迭代一次
		for (i = 1; i <= n; i++)
		{
			sum = 0.0;
			for (j = 1; j <= n; j++)
			{
				if (j != i) sum = sum + a[i][j] * x0[j];
				x1[i] = -1.0 / a[i][i] * sum + b[i] / a[i][i];
			}

		}
		for (i = 1; i <= n; i++)
		{
			x0[i] = x1[i];
			//把每步迭代的结果输入到result中
			fprintf(fp, "%1.12Lf   ", x0[i]);
		}
		//换行
		fprintf(fp, "\n");
	}
	//关闭文件
	fclose(fp);
}


//主程序
int main()
{
	int n, i, MaxNum;
	long double a[dim][dim], b[dim], x0[dim], x[dim];

	//方程组的阶数,系数矩阵,右端常向量
	n = 3;
	a[1][1] = 20.0;  a[1][2] = 2.0;  a[1][3] = 3.0;
	a[2][1] = 1.0;   a[2][2] = 8.0;  a[2][3] = 1.0;
	a[3][1] = 2.0;   a[3][2] = -3.0; a[3][3] = 15.0;
	b[1] = 24.0;     b[2] = 12.0;    b[3] = 30.0;

	//迭代初始值
	for (i = 1; i <= n; i++)
	{
		x0[i] = 1000000;
	}


	//最大迭代次数
	MaxNum = 100;

	//调用Jacobi迭代法求解过程
	Jacobi(n, a, b, x0, MaxNum, x);

	//输出方程组的解
	for (i = 1; i <= n; i++)
	{
		printf("x[%d]=%1.12Lf\n", i, x[i]);
	}

	getchar();

	return 0;
}

 

 

结果:

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Jacobi迭代法C语言代码示例: ```c #include <stdio.h> #include <math.h> #define N 3 // 矩阵维数 #define maxIter 100 // 最大迭代次数 #define tol 1e-6 // 精度要求 int main() { double A[N][N] = {{4,-1,1},{2,5,2},{1,2,4}}; // 系数矩阵 double b[N] = {12,18,22}; // 右端项 double x[N] = {0}; // 初始解向量 double xNew[N] = {0}; // 新解向量 double err; // 两个解向量之差的二范数 int iter = 0; // 迭代次数计数器 while(iter < maxIter) { for(int i=0; i<N; i++) // 遍历每一个未知量 { double sum = 0; for(int j=0; j<N; j++) // 遍历当前未知量对应的方程的系数 { if(i != j) { sum += A[i][j] * x[j]; } } xNew[i] = (b[i] - sum) / A[i][i]; } err = 0; for(int i=0; i<N; i++) { err += pow(xNew[i] - x[i], 2); x[i] = xNew[i]; } err = sqrt(err); if(err < tol) { printf("Jacobi迭代法成功,迭代次数:%d\n", iter); for(int i=0; i<N; i++) { printf("x%d=%f\n", i+1, x[i]); } return 0; } iter++; } printf("Jacobi迭代法失败,达到最大迭代次数%d仍未满足精度要求%f\n", maxIter, tol); return 1; } ``` 在这个示例代码中,我们使用了一个`N`阶方阵`A`和一个长度为`N`的列向量`b`来表示线性方程组。在主函数中,我们定义了一个初始解向量`x`和一个新解向量`xNew`,并且使用一个`while`循环进行迭代计算。在每一次迭代中,我们先遍历每个未知量对应的方程的系数,根据Jacobi迭代法的公式进行计算,并更新新的解向量。然后计算两个解向量之差的二范数作为误差,如果误差小于精度要求,则迭代结束,输出解向量和迭代次数;否则继续迭代。如果达到最大迭代次数仍未满足精度要求,则认为Jacobi迭代法失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值