當前位置:首頁 » 編程語言 » c語言雅可比迭代法求方程組
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言雅可比迭代法求方程組

發布時間: 2023-02-23 09:38:06

❶ 哪位賢才能幫我解這個方程組,需用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;
}