
#include<math.h>
main()
{
int n,M,i,j
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)
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)