❶ 哪位贤才能帮我解这个方程组,需用jacobi(雅克比)迭代法且用程序实现。最好来点说明,小弟再次感激不尽
function X = Jacobi_iteration(A,B,X0,kmax,tol);
% 雅可比(Jacobi)迭代法解线性方程组AX=B
if nargin == 4;
tol = 1*10^(-4); % 设置默认精度
elseif nargin ==3;
tol = 1*10^(-4);
kmax = 500;% 设置默认迭代次数
elseif nargin == 2;
1*10^(-4);
kmax = 500;
X0 = zeros(size(B)); % 设置默认初值
end
n = length(B); % 获得未知数个数
if size(X0,1)<size(X0,2); % 把默认初值改为列向量
X0 = X0';
end
DA = diag(A); %提取A的对角元素
Ap = [diag(DA)-A]./repmat(DA,1,n); % 生成式(7-28)中的矩阵Ap
Bp = B./DA; % 生成式(7-28)中的向量Bp
for k = 1:kmax
X = Ap*X0+Bp; % 雅可比(Jacobi)迭代公式
if norm(X-X0)/(norm(X0)+eps)<tol;% 达到精度将终止循环
break;
end
X0 = X;
end
X=X';
在MATLAB中输入:
A=[5,2,1;-1,4,2;2,-3,10;];
B=[-12,20,3]';
X = Jacobi_iteration(A,B)
运行有:
k =
15
X =
-3.9999 3.0002 1.9999
考虑到你是要给导师看的,就给你上面这个吧,其实可以给一个更简单的,就简单的迭代就行了,下面就是个简单的:不写注释了,相信你应该看得懂的,呵呵
clear all
a=[5,2,1;-1,4,2;2,-3,10;];
b=[-12,20,3];
b=b';
[m,n]=size(a);
x=[0 0 0];
e1=1*10^(-4);
for c=1:100
y=x;
for i=1:n
t1=0;
for j=1:n
t1=t1+a(i,j)*y(j);
end
x(i)=x(i)+(b(i)-t1)/(a(i,i))
end
if abs(y-x)<e1
index=c;
break;
end
end
index
x
❷ 雅克比迭代法是什么
雅克比迭代法就是众多迭代法中比较早且较简单的一种,其命名也是为纪念普鲁士着名数学家雅可比。雅克比迭代法的计算公式简单,每迭代一次只需计算一次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,比较容易并行计算。
考虑线性方程组Ax =b时,一般当A为低阶稠密矩阵时,用主元消去法解此方程组是有效方法。但是,对于由工程技术中产生的大型稀疏矩阵方程组(A的阶数很高,但零元素较多,例如求某些偏微分方程数值解所产生的线性方程组),利用迭代法求解此方程组就是合适的。
在计算机内存和运算两方面,迭代法通常都可利用A中有大量零元素的特点。雅克比迭代法就是众多迭代法中比较早且较简单的一种,其命名也是为纪念普鲁士着名数学家雅可比。
以上内容参考网络-雅克比迭代法
❸ C++:编制用雅克比迭代法解线性方程组的通用程序
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<math.h>
#define EPS 1e-6
#define MAX 100
float *Jacobi(float a[3][4],int n)
{
float *x,*y,s;
double epsilon;
int i,j,k=0;
x=(float *)malloc(n*sizeof(float));
y=(float *)malloc(n*sizeof(float));
for(i=0;i<n;i++) x[i]=0;
while(1)
{
epsilon=0;
k++;
for(i=0;i<n;i++)
{s=0;
for(j=0;j<n;j++)
{if(j==i) continue;
s+=a[i][j]*x[j];
}
y[i]=(a[i][n]-s)/a[i][i];
epsilon += fabs(y[i]-x[i]);
}
if(epsilon < EPS)
{
printf("µ¸¥˙¥Œ ˝Œ™:%d\n",k);
return y;
}
if(k>=MAX)
{printf("The Method is disconvergent");return y;}
for(i=0;i<n;i++) x[i]=y[i];
}
}
main()
{int i,j; float a[3][4];
float *x;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
scanf("%f",&a[i][j]);
}
x=(float *)malloc(3*sizeof(float));
x=Jacobi(a,3);
//clrscr();
for(i=0;i<3;i++)printf("x[%d]=%f\n",i,x[i]);
getch();
}
❹ 用雅克比迭代法解下列线性方程组的两次迭代解(取初始向量X(0)=0.... 具体如下图
雅克比迭代就是先找到迭代表达式,然后一次次迭代直到前后两次的值相差极小或者相等就停止迭代。详见下图
❺ 雅克比迭代法c语言程序,急!
double a[N][N]={ 0,0,0,0,
0.78,-0.02,-0.12,-0.14,
-0.02,0.86,-0.04,0.06,
-0.12,-0.04,0.72,-0.08,
-0.14,0.06,-0.08,0.74},
你定义的N为4,4*4=16,但你初始化有20个值,建议改成4*5,或5*5
❻ 雅克比迭代法求解线性方程组的C语言程序
void Solve ( double dCoef [] , double dY [] , unsigned int iOrder , double dErr)
{//用Jacobi迭代法解方程组, dCoef[]系数阵, Y[]向量, iOrder给出方程阶数, dErr给出精度
double res [Max]; //方程解
double res2[Max]; //保存上一阶方程解
if ( Max < iOrder )
{
printf ("最多支持%d阶方程组.", Max);
return;
}
for ( unsigned int i = 0 ; i < iOrder ; res2 [i++] = 0.0 ); //初始解向量 (0,0...)
while ( true )
{
bool bStopIterative = true;
for (unsigned int i = 0 ; i < iOrder ; ++i)
{
double dSum2 = 0;
for (unsigned int j = 0 ; j < iOrder ; j++)
{//求第二项
if ( j == i ) continue;
dSum2 += dCoef [i * iOrder + j] * res2 [j];
}
res[i] = 1/dCoef[i * iOrder + i] * ( dY[i] - dSum2 );
if ( abs ( res2[i] - res [i] ) > dErr )
bStopIterative = false;
}
if ( bStopIterative )
break;
for (unsigned int i = 0 ; i < iOrder ; i++ )
res2[ i ] = res[ i ];
}
//输出结果
for (unsigned int i = 0 ; i < iOrder ; i++)
printf ("x%d = %lf\n", i+1 , res[i]);
}
int main(int argc, char* argv[])
{
double a[] =
{
8,-3,2,
4,11,-1,
2,1,4
};
double b[3] =
{
20,33,12
};
Solve ( a , b , 15 , 1e-10);
getchar();
return 0;
}