数值分析Jacobi迭代法c/c++实现

matlab还没学精通,正好好久没写代码了,借此温习温习。

//Jacobi.cpp
#include "Jacobi.h"
#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;
using std::vector;
vector<double> matrix_A;
vector<double> vector_b;

Jacobi::Jacobi()
{
	cout << "输入方阵维数:";
	cin >> order;
	std::cout << order << "阶矩阵构造成功" << endl; 
}



void Jacobi::input_matrix_A()
{	//由于数组在编译阶段就已经分配内存,维度必须是常量,故此处用向量来存储矩阵
	//初始化为order*order个int元素,没个元素都被初始化为0
	
	double elemt = 0;
	for (int i = 0; i <= order * order - 1; i++)
	{
		cout << "输入第" << i + 1 << "个元素" << endl;
		cin >> elemt;
		matrix_A.push_back(elemt);
	}
	pointer_A = &matrix_A[0];
	cout << "输入的矩阵为" << endl;
	output_matrix(pointer_A);
	
}

void Jacobi::input_vector_b()
{
	double element;
	for (int i = 0; i < order; i++)
	{
		cout << "请输入第" << i + 1 << "个b元素" << endl;
		cin >> element;
		vector_b.push_back(element);//构造成Ax-b=0
	}
	pointer_b = &vector_b[0];
	cout << "输入的列向量为" << endl;
	output_vector(pointer_b);
	
}
void Jacobi::structure_iterator()
{
	
	
	
	for (int i = 0; i <= order - 1; i++)
	{
		int denominator = pointer_A[i * order + i];
		pointer_b[i] = (pointer_b[i]) / denominator;
		for (int j = 0; j <= order - 1; j++)
		{
			pointer_A[i * order + j] = -(pointer_A[i * order + j]) / denominator;
		}
		pointer_A[i * order + i] = 0;
		
	}
	cout << "绝对误差限";
	double e;
	cin >> e;
	vector<double> vector_xk(order, 0);
	int n = 0,k=0;//n为满足绝对误差的解的个数,k为迭代次数
	do
	{
		n = 0;
		vector<double> vector_xk1(order, 0);//每次都初始化k+1
		
		for (int i = 0; i < order; i++)
		{
			for (int j = 0; j < order; j++)
			{
				vector_xk1[i] += (vector_xk[j] * pointer_A[i * order + j]);
			}
			vector_xk1[i] += pointer_b[i];
		}
		
		for (int i = 0; i < order; i++)
		{
			
			if (abs(vector_xk[i]-vector_xk1[i]) < e) 
			{
				n++;
			}

		}
		vector_xk = vector_xk1;
		k++;
		cout << "k=" << k << endl;
		output_vector(&vector_xk[0]);
	} while (n<order);

}
void Jacobi::output_matrix(double* p)
{
	double* pointer = p;
	for (int i = 0; i <= order - 1; i++)
	{
		for (int j = 0; j <= order - 1; j++)
		{
			cout << pointer[i * order + j] << "\t";
		}
		cout << endl;
	}

}

void Jacobi::output_vector(double* q)
{
	double* pointer = q;
	for (int i = 0; i < order; i++)
	{
		cout << pointer[i] << "\t";
	}
	cout << endl;
}```

```cpp
//Jacobi.h
#ifndef _JACOBI_H_
#define _JACOBI_H_

class Jacobi
{
public:
	void input_matrix_A(); //输入系数矩阵A
	void input_vector_b();//输入AX=b中的向量b
	void structure_iterator();//构造迭代公式
	void output_matrix(double* p);//输出矩阵
	void output_vector(double* q);//输出向量
	

	Jacobi();
private:
	
	double*  pointer_A = 0;//指向系数矩阵的指针
	double* pointer_b = 0;//指向b的指针
	int order = 0; //矩阵阶数
};

#endif
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值