雅克比迭代法文档格式.docx

上传人:b****6 文档编号:18669915 上传时间:2022-12-31 格式:DOCX 页数:17 大小:159.98KB
下载 相关 举报
雅克比迭代法文档格式.docx_第1页
第1页 / 共17页
雅克比迭代法文档格式.docx_第2页
第2页 / 共17页
雅克比迭代法文档格式.docx_第3页
第3页 / 共17页
雅克比迭代法文档格式.docx_第4页
第4页 / 共17页
雅克比迭代法文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

雅克比迭代法文档格式.docx

《雅克比迭代法文档格式.docx》由会员分享,可在线阅读,更多相关《雅克比迭代法文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

雅克比迭代法文档格式.docx

un+1=un+hf(tn,un)

欧拉隐式方法:

改进的Euler公式

n+1=yn+hf(xn,yn)

yn+1=yn+

[f(xn,yn)+f(xn+1,

n+1)]

三、主要仪器设备及耗材

WindowsXpVC++6.0

第二部分:

实验调试与结果分析

一、调试过程

Jacobi迭代法

#include<

stdio.h>

#defineN10

floatABS(float,float);

int

main(void)

{

inti,j,n;

floata[N][N],b[N];

floatx[N],y[N];

floate,total;

printf("

Pleaseinputthedimension:

"

);

scanf("

%d"

&

n);

PleaseinputtheCoefficientMatrix:

"

for(i=0;

i<

n;

i++)

for(j=0;

j<

j++)

%f"

a[i][j]);

PleaseinputtheVector:

b[i]);

Pleaseinputtheinitialvector:

x[i]);

do

{

total=0.0f;

if(i!

=j)

total+=a[i][j]*x[j];

}

y[i]=(b[i]-total)/a[i][i];

e=0.0f;

e=e+ABS(x[j],y[j]);

printf("

%f\n"

e);

x[i]=y[i];

while(e>

0.0001);

x%d=%f\t"

i,x[i]);

\n"

return0;

}

floatABS(floatx,floaty)

inttotal;

if(x<

y)total=y-x;

elsetotal=x-y;

returntotal;

}

结果:

流程图:

Gauss-Seidel迭代法

#include<

intmain()

doublex[3]={0,0,0};

doublea[3][3]={6,2,-1,1,4,-2,-3,1,4};

doubley[3]={-3,2,4};

doubled[3][3],g[3];

intround=5,i,j;

for(i=0;

i<

3;

++i)

g[i]=y[i]/a[i][i];

for(j=0;

j<

++j)

d[i][j]=i==j?

0:

-a[i][j]/a[i][i];

while(round--){

x[i]=g[i];

x[i]+=d[i][j]*x[j];

%lf"

x[i]);

结果:

超松弛因子迭代法

iostream>

cmath>

usingnamespacestd;

float*one_array_malloc(intn);

float**two_array_malloc(intm,intn);

floatmatrix_category(float*x,intn);

intmain(){constintMAX=100;

intn,i,j,k;

float**a;

float*x_0;

float*x_k;

floatprecision;

floatw;

cout<

<

输入精度e:

;

cin>

>

precision;

cout<

endl<

输入系数矩阵的阶数,N:

cin>

n;

a=two_array_malloc(n,n+1);

输入增广矩阵的各值:

for(i=0;

i<

i++)

{

for(j=0;

j<

n+1;

j++)

{cin>

a[i][j];

}

x_0=one_array_malloc(n);

输入初始向量:

for(i=0;

i++)

x_0[i];

x_k=one_array_malloc(n);

输入松弛因子w(1<

w<

2):

w;

floattemp;

for(k=0;

k<

MAX;

k++)

{for(i=0;

{temp=0;

i;

{temp=temp+a[i][j]*x_k[j];

x_k[i]=a[i][n]-temp;

temp=0;

for(j=i+1;

{temp=temp+a[i][j]*x_0[j];

x_k[i]=(x_k[i]-temp)/a[i][i];

x_k[i]=(1-w)*x_0[i]+w*x_k[i];

{x_0[i]=x_k[i]-x_0[i];

if(matrix_category(x_0,n)<

precision)

{break;

else{for(i=0;

{x_0[i]=x_k[i];

if(MAX==k)

{cout<

迭代不收敛\n"

迭代次数为:

endl;

解向量为:

x"

:

x_k[i]<

float*one_array_malloc(intn)

{float*a;

a=(float*)malloc(sizeof(float)*n);

returna;

float**two_array_malloc(intm,intn)

{float**a;

inti;

a=(float**)malloc(m*sizeof(float*));

m;

{a[i]=(float*)malloc(n*sizeof(float));

floatmatrix_category(float*x,intn)

{inti;

floattemp=0;

{temp=temp+fabs(x[i]);

returntemp;

三角分解法

constintN=100;

staticdoublea[N][N],b[N];

inti,j,k,num,p;

doublem,t,q;

请输入矩阵阶数:

num;

//输入a[i][j],b[i]

nowinputthematrixa[i][j],i,j=1..."

num<

:

for(i=1;

=num;

for(j=1;

j++)

cout<

a["

]["

]="

nowinputthematrixb[i],i=1..."

b["

b[i];

t=0;

for(i=1;

m=0;

for(j=i;

=num+1;

for(k=1;

=i-1;

k++)

m=m+a[i][k]*a[k][j];

a[i][j]=a[i][j]-m;

t=t+a[j][k]*a[k][i];

a[j][i]=(a[j][i]-t)/a[i][i];

a[num][num+1]=a[num][num+1]/a[num][num];

q=0;

for(k=num-1;

k>

=1;

k--)

for(j=k+1;

q=q+a[k][j]*a[j][num+1];

a[k][num+1]=(a[k][num+1]-q)/a[k][k];

方程组的解为:

x["

a[i][num+1]<

欧拉显式方法

conio.h>

math.h>

doublef(doublex,doubley)

{

returnx*pow(y,1.0/3);

intmain()

inti;

doublex,y,y0=1,dx=0.1;

doublexx[11];

doubleeuler[11],euler_2[11];

doubletemp;

doublef(doublex,doubley);

for(i=0;

11;

xx[i]=i*dx;

euler[0]=y0;

for(i=1,x=0;

i++,x+=dx)

euler[i]=euler[i-1]+dx*f(x,euler[i-1]);

euler_2[0]=y0;

temp=euler_2[i-1]+dx*f(x,euler_2[i-1]);

euler_2[i]=euler_2[i-1]+dx*(f(x,euler_2[i-1])+f(x+dx,temp))/2;

for(i=0,x=0;

printf("

x=%lf\teluer=%lf\teuler_2=%lf\taccu=%lf\n"

x,euler[i],euler_2[i],pow(1+x*x,1.0/3));

getch();

欧拉隐式方法

#definef(x,y)(x+y)

{intm;

doublea,b,y0;

doublexn,yn,xn1,yn1,yn1b;

doubleh;

\nInputthebeginandendofx:

scanf("

%lf%lf"

&

a,&

b);

Inputtheyvalueat%f:

a);

y0);

Inputmvalue[divide(%f,%f)]:

a,b);

m);

if(m<

=0)

{printf("

Pleaseinputanumberlargerthan1.\n"

return

(1);

h=(b-a)/m;

xn=a;

yn=y0;

=m;

{xn1=xn+h;

yn1b=yn+h*f(xn,yn);

yn1=yn+h/2*(f(xn,yn)+f(xn1,yn1b));

x%d=%f,y%d=%f\n"

i,xn1,i,yn1);

xn=xn1;

yn=yn1;

}return(0);

二、实验结果及分析

雅克比迭代法的全部分量都是间接利用,由于新值比旧值好,Gauss-Seidel迭代法直接对算出的分量加以使用,这样使得迭代的收敛情况有所改善,而超松弛法是在Gauss-Seidel迭代法的基础上,应用加速收敛思想而构造的一种方法;

欧拉公式和梯形公式在计算上有明显的区别,欧拉公式的特点是可以有UN直接计算Un+1,也就是显式的,而梯形公式右端也有Un+1,必须通过解方程才能求得,这类是隐式的。

从算法的角度看显式远比隐式方便,隐式通常用迭代法求解。

三、实验小节、建议及体会

任何一种方法都有它的优点和局限性,只有找到一种方法能够解决我们的问题,又尽量减少出错,减少计算量就是符合这个问题的好方法。

良好的编程习惯有助于检查错误,也可以增强程序的可阅读性。

 

(范文素材和资料部分来自网络,供参考。

可复制、编制,期待你的好评与关注)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1