求雅可比迭代法的程序流程图及3×3结构的C程序

求雅可比迭代法的程序流程图及3×3结构的C程序,第1张

#include<stdio.h>

#include<math.h>

main()

{

int n,M,i,j

printf("请输入希望迭代的次数")

scanf("%d",&M)

printf("请输入方程阶数")

scanf("%d"迅迹,&n)

float p,y[n],x[n],a[n][n],b[n]

printf("请输入误差限")

scanf("%f",&p)

printf("请输入系数行列式")

for(i=0i<ni++)

for(j=0j<nj++)

scanf("%f",&a[i][j])

printf("请输入常数项向量")

for(i=0i<ni++)

scanf("%f",&b[i])

printf("请输入初始向量")

for(i=0i<困让ni++)

scanf("%f",&x[i])

for(k=1k<=Mk++)

{

for(i=0i<ni++)

for(j=0j<nj++)

{

if(j==i) continue

else y[i]=(b[i]-a[i][j]x[i])/a[i][i]

}

for(i=0i<ni++)

if(fabs(x[i]-y[i])<p)

for(i=0i<ni++)

{

printf("x%d=%f",i+1,y[i])break

}

else for(i=0i<ni++)

x[i]=y[i]

}

if(k>M) printf("没有得到在误差亩尺并范围内的根")

}

给你一个正确的程序,你自己参考一下吧!

function [x,k]=Jacobimethod(A,b,x0,N,emg)

% A:线性方程组左端矩阵

% b:线性没伍滚方程组右端向量

% x0:迭代初值

% N:迭橘肢代次数上界,若迭代枯余次数大于n,则迭代失败

% emg:精度指标

% k:迭代次数

% x:用迭代法求得的线性方程组的近似解

n=length(A)

x1=zeros(n,1)x2=zeros(n,1)

x1=x0k=0

r=max(abs(b-A*x1))

while r>emg

for i=1:n

sum=0

for j=1:n

if i~=j

sum=sum+A(i,j)*x1(j)

end

end

x2(i)=(b(i)-sum)/A(i,i)

end

r=max(abs(x2-x1))

x1=x2

k=k+1

if k>N

disp('迭代失败,返回');

return

end

end

祝朋友好运!

#include<iostream>

#include<math.h>

#include<iomanip>

using namespace std

#define kk 50 //定义最大方程元数

int n,i,c,j,ll,hh,gg,mm

double A[kk][kk],x[kk][kk],b[kk],y[kk],a[kk],z[kk],m,nn,d,e=1,w,fff

void main()

{

cout<<" **********************************************************************"局饥<<endl

cout<<" ***本程序可以用雅可比迭代法,塞德尔迭代法,逐次超松弛法求解线性方程组***"<<endl

cout<<" ***************************制作人:李小龙*****************************"<<endl

cout<<" ***********************说明:方程最多个数为50**************************"<<endl

cout<<" **********************************************************************"<<endl

//*********************************数据的输入********************************

/*bb:*/cout<<"输入的方程元数"<<endl

cin>>n

cout<<"请输入方程系数矩阵:"<<endl

for(i=0i<ni++)

for(j=0j<nj++)

cin>>A[i][j]

cout<<"请输入右边向量:"<<endl

for(i=0i<ni++)

cin>>b[i]

cout<<"输入你想要的迭代精度(建议1e-5以上)!"<<endl

cin>>fff

cout<<"输入最大迭代次数(建议300次以上)!"<<endl

cin>>mm

////*******************************判断是否对角占优*************************

//for(i=0i<ni++)

// {

// for(j=0j<nj++)

// {

//nn=0

//if(i==j)

//{

// d=fabs(A[i][i])

//}

//else

// nn=nn+fabs(A[i][j])

// }

// if(nn>d)

// {

//cout<<"该方程不对角占优,迭代不收敛"<<endl

//cout<<"是否继续?是(0),否(1)"<<endl

//cin>>hh

//if(hh!=1)

// goto bb

//else exit(1)

// }

// }

//********************************计算出迭代矩阵*************************

for(i=0i<ni++)

{

b[i]=b[i]/A[i][i]

for(j=0j<nj++)

{

if(i==j)

{

x[i][i]=0

}

else

{

x[i][j]=-A[i][j]/A[i][i]

}

}

}

//*******************************输出迭代矩阵*****************************

cout<<"计算渣腊瞎出迭代矩阵为:"<<endl

for(i=0i<ni++)

{

for(j=0j<nj++)

cout<<x[i][j]<<""

cout<<b[i]<<" "

cout<<endl

}

//****************************迭代方法的选择*****************************

cout<<"请你选择迭代方法!"<<endl

cout<<endl

cout<<endl

cout<<"选用雅可比迭代法,请输入(1)!"<<endl

cout<<endl

cout<<endl

cout<<"选用塞德尔迭代法,请输入(2)!"<<如空endl

cout<<endl

cout<<endl

cout<<"选用逐次超松弛法,请输入(3)!"<<endl

cout<<endl

cout<<endl

cin>>ll

//*****************************赋迭代初值***********************************

cout<<"输入迭代初值"<<endl

for(i=0i<ni++)

cin>>y[i]

int f=1

switch(ll)

{

case 1:goto cc

break

case 2:goto aa

break

case 3:goto dd

}

//***************************雅可比迭代法************************************

cc:cout<<" "

for(i=1i<n+1i++)

cout<<"X["<<i<<"]"<<" "

cout<<"精度"

cout<<endl

cout<<"迭代初值为: "

cout<<setiosflags(ios::fixed)

for(i=0i<ni++)

cout<<y[i]<<" "

cout<<endl

while(e>fff)

{

for(i=0i<ni++)

z[i]=y[i]

for(i=0i<ni++)

{

nn=0

for(j=0j<nj++)

{

if(i!=j)

nn=nn+x[i][j]*z[j]

y[i]=nn+b[i]

}

e=fabs(z[0]-y[0])

if(fabs(z[i]-y[i])>e)

e=fabs(z[i]-y[i])

if(i==0)

{

cout<<setiosflags(ios::fixed)

cout<<"第"<<setw(3)<<setprecision(3)<<f++<<"次迭代"<<" "

}

cout<<setiosflags(ios::fixed)

cout<<setw(8)<<setprecision(8)<<y[i]<<" "

}

cout<<e

cout<<endl

if(f>mm)

{

cout<<"迭代次数大于"<<mm<<"次"<<endl

cout<<"认为方程发散,迭代不收敛"<<endl

exit(1)

}

}

cout<<endl

cout<<endl

cout<<"方程迭代了"<<f-1<<"次,达到你所要求的精度"<<fff<<endl

cout<<"最后结果为:"<<endl

cout<<endl

for(i=0i<ni++)

{

cout<<"X"<<"["<<i+1<<"]"<<"="<<y[i]

cout<<endl

}

exit(1)

//***********************************塞德尔迭代法********************************

aa:cout<<" "

for(i=1i<n+1i++)

cout<<"X["<<i<<"]"<<" "

cout<<"精度"

cout<<endl

cout<<"迭代初值为: "

cout<<setiosflags(ios::fixed)

for(i=0i<ni++)

cout<<y[i]<<" "

cout<<endl

while(e>fff)

{

for(i=0i<ni++)

{

z[i]=y[i]

nn=0

for(j=0j<nj++)

{

nn=nn+x[i][j]*y[j]

y[i]=nn+b[i]

}

e=fabs(z[0]-y[0])

if(fabs(z[i]-y[i])>e)

e=fabs(z[i]-y[i])

if(i==0)

{

cout<<setiosflags(ios::fixed)

cout<<"第"<<setw(3)<<setprecision(3)<<f++<<"次迭代"<<" "

}

cout<<setiosflags(ios::fixed)

cout<<setw(8)<<setprecision(8)<<y[i]<<" "

}

cout<<e

cout<<endl

if(f>mm)

{

cout<<"迭代次数大于"<<mm<<"次"<<endl

cout<<"认为方程发散,迭代不收敛"<<endl

exit(1)

}

}

cout<<endl

cout<<endl

cout<<"方程迭代了"<<f-1<<"次,达到你所要求的精度"<<fff<<endl

cout<<"最后结果为:"<<endl

cout<<endl

for(i=0i<ni++)

{

cout<<"X"<<"["<<i+1<<"]"<<"="<<y[i]

cout<<endl

}

exit(1)

//***********************************逐次超松弛法********************************

dd: cout<<"输入加速因子W(0<W<2):"<<endl

cin>>w

/*if((w>2)||(w<0))

{

cout<<"输入错误!加速因子W(0<W<2):"<<endl

cout<<"请重新输入:"<<endl

cin>>w

}*/

//不知道为什么写成这样大于2能判断,而小于0就不能判断老?????

if(w>=2)//还有w>=2,w<=0输入0或2时也不能判断!!

{

cout<<"输入错误!加速因子W(0<W<2):"<<endl

cout<<"请重新输入:"<<endl

cin>>w

}

if(w<=0)

{

cout<<"输入错误!加速因子W(0<W<2):"<<endl

cout<<"请重新输入:"<<endl

cin>>w

}

cout<<" "

for(i=1i<n+1i++)

cout<<"X["<<i<<"]"<<" "

cout<<"精度"

cout<<endl

cout<<"迭代初值为: "

cout<<setiosflags(ios::fixed)

for(i=0i<ni++)

cout<<y[i]<<" "

cout<<endl

while(e>fff)

{

for(i=0i<ni++)

{

z[i]=y[i]

nn=0

for(j=0j<nj++)

{

nn=nn+x[i][j]*y[j]

y[i]=(1-w)*z[i]+w*(nn+b[i])

}

e=fabs(z[0]-y[0])

if(fabs(z[i]-y[i])>e)

e=fabs(z[i]-y[i])

if(i==0)

{

cout<<setiosflags(ios::fixed)

cout<<"第"<<setw(3)<<setprecision(3)<<f++<<"次迭代"<<" "

}

cout<<setiosflags(ios::fixed)

cout<<setw(8)<<setprecision(8)<<y[i]<<" "

}

cout<<e

cout<<endl

if(f>mm)

{

cout<<"迭代次数大于"<<mm<<"次"<<endl

cout<<"认为方程发散,迭代不收敛"<<endl

exit(1)

}

}

cout<<endl

cout<<endl

cout<<"方程迭代了"<<f-1<<"次,达到你所要求的精度"<<fff<<endl

cout<<"最后结果为:"<<endl

cout<<endl

for(i=0i<ni++)

{

cout<<"X"<<"["<<i+1<<"]"<<"="<<y[i]

cout<<endl

}

exit(1)

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12546089.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-26
下一篇2025-08-26

发表评论

登录后才能评论

评论列表(0条)

    保存