D03编号241438文件名数值方法程序作业.docx

上传人:b****3 文档编号:27463901 上传时间:2023-07-01 格式:DOCX 页数:32 大小:26.37KB
下载 相关 举报
D03编号241438文件名数值方法程序作业.docx_第1页
第1页 / 共32页
D03编号241438文件名数值方法程序作业.docx_第2页
第2页 / 共32页
D03编号241438文件名数值方法程序作业.docx_第3页
第3页 / 共32页
D03编号241438文件名数值方法程序作业.docx_第4页
第4页 / 共32页
D03编号241438文件名数值方法程序作业.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

D03编号241438文件名数值方法程序作业.docx

《D03编号241438文件名数值方法程序作业.docx》由会员分享,可在线阅读,更多相关《D03编号241438文件名数值方法程序作业.docx(32页珍藏版)》请在冰豆网上搜索。

D03编号241438文件名数值方法程序作业.docx

D03编号241438文件名数值方法程序作业

第二章上机作业

.n次拉格朗日插值计算公式Ln(x)

拉格朗日子程序:

doublelaglangre(intn,doublex[],doubley[],doublex1)

{

inti,j;

doubleln=1.0;

doubleLn=0.0;

for(i=0;i<=n;i++)

{

ln=1.0;

for(j=0;j<=n;j++)

{

if(i!

=j)

{

ln=(x1-x[j])/(x[i]-x[j])*ln;

}

}

Ln=Ln+ln*y[i];

}

return(Ln);

}

程序说明:

//总节点数为n+1

//x[]为插值节点

//y[]为对应插值节点的函数值

//x1为求值插值点

计算习题2

(1)

主函数为:

#include

#include

doublemain()

{intn1=10;

doublexx[11]={1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0};

doubleyy[11]={0,0.0953,0.1823,0.2624,0.3365,0.4055,0.4700,0.5306,0.5877,0.6419,0.6934};

doublexxx=1.54;

doubleyyy=0;

doublelaglangre(intn,doublex[],doubley[],doublex1);

yyy=laglangre(n1,xx,yy,xxx);

printf("Theresultis%1.6f\n",yyy);

getchar();

}

计算结果:

当所求x值为1.54时,

Theresultis0.431806

当所求x值为1.98时,

Theresultis0.683588

总结:

当x值为1.54时,精确值为0.431782,误差为0.000024,当x值为1.98时,精确值为0.683097,误差为0.000491。

2.n次牛顿向前插值计算公式

n次牛顿向前插值计算公式的子程序

doubleNewton(intn,doubleh,doublex[N],doubley[N],doublexx)

{

inti,j;

longints1;

doublet,yy[N][N],s;

doubleNewton=0.0;

doublek=y[0];

t=(xx-x[0])/h;

s=1.0;

s1=1;

for(i=0;i

for(j=0;j

{

yy[i][j]=0.0;

}

for(i=0;i

for(j=0;j

{

yy[i][j]=y[j+1]-y[j];

y[j]=yy[i][j];

}

for(i=0;i

{

y[i+1]=yy[i][0];

}

y[0]=k;

for(i=0;i<11;i++)

{

if(i==0)

{

s=1.0;

s1=1;

}

else

{

s1=s1*i;

s=s*(t-i+1);

}

Newton=Newton+s*y[i]/s1;

}

return(Newton);

}

程序说明:

//n表示插值节点数

//h为步长

//x[N]为插值节点

//y[N]为插值节点对应的插值函数值

//xx为所求插值节点

计算习题2

(1)

主函数为:

#include

#defineN11

doublemain()

{

doubleNewton(intn,doubleh,doublex[N],doubley[N],doublexx);

intn1=11;

doublex1[N]={1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0};

doubley1[N]={0,0.0953,0.1823,0.2624,0.3365,0.4055,0.4700,0.5306,0.5877,0.6419,0.6934};

doubleh1=0.1;

doublexx1=1.98;

doubleyy1=Newton(n1,h1,x1,y1,xx1);

printf("Theresultis:

%f\n",yy1);

getchar();

}

计算结果:

当所求的x值为1.54时,

Theresultis:

0.431806

当所求的x值为1.98时,

Theresultis:

0.683588

总结:

当x值为1.54时,精确值为0.431782,误差为0.000024,当x值为1.98时,精确值为0.683097,误差为0.000491。

第五章上机作业

.杜利特尔三角分解

杜利特尔三角分解子程序

double*Doolittle(doublea[N][N],doubleb[N])

{

inti,j,k;

double*p,x[N],y[N],sum;

doublel[N][N],u[N][N];

for(i=0;i

for(j=0;j

{

l[i][j]=0;

u[i][j]=0;

}

for(i=0;i

{

l[i][i]=1;

u[0][i]=a[0][i];

}

for(i=1;i

{

l[i][0]=a[i][0]/u[0][0];

}

for(i=1;i

{

for(j=i;j

{

sum=0;

for(k=0;k

{

sum=sum+l[i][k]*u[k][j];

}

u[i][j]=a[i][j]-sum;

}

for(j=i+1;j

{

sum=0;

for(k=0;k

{

sum=sum+l[j][k]*u[k][i];

}

l[j][i]=(a[j][i]-sum)/u[i][i];

}

}

for(i=0;i

{

sum=0;

if(i==0)

{

y[i]=b[i];

}

else

{

for(k=0;k

{

sum=sum+l[i][k]*y[k];

}

y[i]=b[i]-sum;

}

}

printf("TheresultofLis:

\n");

for(i=0;i

for(j=0;j

{

printf("%4.2f",l[i][j]);

}

printf("\n");

printf("TheresultofUis:

\n");

for(i=0;i

for(j=0;j

{

printf("%4.2f",u[i][j]);

}

printf("\n");

for(i=N-1;i>=0;i--)

{

sum=0;

if(i==N-1)

{

x[i]=y[i]/u[i][i];

}

else

{

for(k=i;k

{

sum=sum+u[i][k]*x[k];

}

x[i]=(y[i]-sum)/u[i][i];

}

}

p=x;

return(p);

}

程序说明

//该函数设计成返回指针值函数。

//a[N][N]为矩阵A

//b[N]为方程组右端b的值组成的n*1矩阵

//l[N][N]为单位下三角矩阵

//u[N][N]为可逆上三角矩阵

//x[N]为方程组的解,返回指针指向该数组

计算习题五(P179)

//b的初始值设为{1,1,1,1,1,1}

主函数为:

voidmain()

{

inti,j;

intk=0;

double*q,maxx,c[N];

doublea1[N][N]={1,2,4,7,11,16,2,3,5,8,12,17,4,5,6,9,13,18,7,8,9,10,14,19,11,12,13,14,15,20,16,17,18,19,20,21};

doubleb[N]={1,1,1,1,1,1};

double*Doolittle(doublea[N][N],doubleb[N]);

doublemax(doublexx[N]);

for(i=0;i<10;i++)

{

k++;

q=Doolittle(a1,b);

printf("k=%d\n",k);

printf("Theresultofxis(x[0]...x[N-1]):

\n");

for(j=0;j

{

c[j]=*(q+j);

printf("%f\n",c[j]);

}

maxx=max(c);

printf("Theresultofbis:

\n");

for(j=0;j

{

b[j]=c[j]/maxx;

printf("%f\n",b[j]);

}

getchar();

}

}

其中函数max为:

doublemax(doublex[N])

{

inti;

doublemax;

max=fabs(x[0]);

for(i=0;i

{

if(max<=fabs(x[i+1]))

max=fabs(x[i+1]);

}

return(max);

}

计算结果

TheresultofLis:

1.000.000.000.000.000.002.001.000.000.000.000.004.003.001.000.00

0.000.007.006.001.001.000.000.0011.0010.001.001.001.000.0016.00

15.001.001.001.001.00

TheresultofUis:

1.002.004.007.0011.0016.000.00-1.00-3.00-6.00-10.00-15.000.000.00

-1.00-1.00-1.00-1.000.000.000.00-2.00-2.00-2.000.000.000.000.00

-3.00-3.000.000.000.000.000.00-4.00

k=1

Theresultofxis(x[0]...x[N-1]):

-1.000000

1.000000

-0.000000

-0.000000

-0.000000

-0.000000

Theresultofbis:

-1.000000

1.000000

-0.000000

-0.000000

-0.000000

-0.000000

k=2

Theresultofxis(x[0]...x[N-1]):

50.166667

-51.166667

2.000000

0.333333

0.166667

2.500000

Theresultofbis:

0.980456

-1.000000

0.039088

0.006515

0.003257

0.048860

k=3

Theresultofxis(x[0]...x[N-1]):

-204.964169

108.650380

-3.712269

-0.481542

-0.319218

-2.486971

Theresultofbis:

-1.000000

0.530095

-0.018112

-0.002349

-0.001557

-0.012134

k=4

Theresultofxis(x[0]...x[N-1]):

468.285487

-160.461507

4.551862

0.409722

0.443818

1.915262

Theresultofbis:

1.000000

-0.342657

0.009720

0.000875

0.000948

0.004090

k=5

Theresultofxis(x[0]...x[N-1]):

-832.662529

210.162432

-5.170269

-0.185233

-0.554945

-1.679107

Theresultofbis:

-1.000000

0.252398

-0.006209

-0.000222

-0.000666

-0.002017

k=6

Theresultofxis(x[0]...x[N-1]):

1295.271049

-259.127363

5.872836

-0.164120

0.659122

1.565835

Theresultofbis:

1.000000

-0.200056

0.004534

-0.000127

0.000509

0.001209

k=7

Theresultofxis(x[0]...x[N-1]):

-1855.320735

308.199805

-6.843905

0.625775

-0.759163

-1.500246

Theresultofbis:

-1.000000

0.166117

-0.003689

0.000337

-0.000409

-0.000809

k=8

Theresultofxis(x[0]...x[N-1]):

2513.654295

-358.313583

8.224557

-1.192847

0.856489

1.457746

Theresultofbis:

1.000000

-0.142547

0.003272

-0.000475

0.000341

0.000580

k=9

Theresultofxis(x[0]...x[N-1]):

-3273.096634

410.641679

-10.136369

1.861057

-0.951913

-1.428243

Theresultofbis:

-1.000000

0.125460

-0.003097

0.000569

-0.000291

-0.000436

k=10

Theresultofxis(x[0]...x[N-1]):

4138.984057

-466.636130

12.690545

-2.627512

1.045951

1.406861

Theresultofbis:

1.000000

-0.112742

0.003066

-0.000635

0.000253

0.000340

2.乔利斯基三角分解方法

乔利斯基三角分解子程序

double*Cholesky(doublea[N][N],doubleb[N])

{

inti,j,k;

double*p;

doublex[N],y[N];

doublesum,sum2;

doublel[N][N];

doubleu[N][N];

if(a[0][0]<=0)

{

printf("输入矩阵A不是对称正定矩阵");

}

for(i=0;i

for(j=0;j

{

l[i][j]=0;

u[i][j]=0;

}

for(i=0;i

{

if(i==0)

{

l[i][i]=sqrt(a[i][i]);

}

l[i][0]=a[i][0]/l[0][0];

}

for(i=1;i

{

sum=0;

for(k=0;k

{

sum=sum+l[i][k]*l[i][k];

}

l[i][i]=sqrt(a[i][i]-sum);

for(j=i+1;j

{

sum2=0;

for(k=0;k

{

sum2=sum2+l[j][k]*l[i][k];

}

l[j][i]=(a[j][i]-sum2)/l[i][i];

}

}

for(i=0;i

for(j=0;j

{

u[j][i]=l[i][j];

}

for(i=0;i

{

sum=0;

if(i==0)

{

y[i]=b[i]/l[i][i];

}

else

{

for(k=0;k

{

sum=sum+l[i][k]*y[k];

}

y[i]=(b[i]-sum)/l[i][i];

}

}

for(i=N-1;i>=0;i--)

{

sum=0;

if(i==N-1)

{

x[i]=y[i]/l[i][i];

}

else

{

for(k=i;k

{

sum=sum+u[i][k]*x[k];

}

x[i]=(y[i]-sum)/u[i][i];

}

}

p=x;

return(p);

}

程序说明:

//N为矩阵的维数

//a[N][N]为方程组A矩阵,为对称正定矩阵

//b[N]为方程组的常数向量

//l[N]为可逆的下三角矩阵

//u[N]为单位上三角矩阵

//x[N]为求解的方程组的解

计算习题9的

(1)(P178)

主函数为:

#include

#include

#defineN4

voidmain()

{

inti;

double*q,c[N];

doublea1[N][N]={4,2.4,2,3,2.4,5.44,4,5.8,2,4,5.21,7.45,3,5.8,7.45,19.66};

doubleb[N]={12.280,16.928,22.957,50.945};

double*Cholesky(doublea[N][N],doubleb[N]);

q=Cholesky(a1,b);

for(i=0;i

{

c[i]=*(q+i);

}

printf("TheresultofXis:

\n");

for(i=0;i

{

printf("%f\n",c[i]);

}

getchar();

}

计算结果:

TheresultofXis:

1.200000

-0.800000

1.700000

2.00000

第六章上机作业

1.雅可比迭代公式

雅可比迭代子程序:

voidJacobi(doublex[N],doublea[N][N],doubleb[N],doubleeps,intCNT)

{

inti,j;

doubley[N],c[N],sum,max;

doubleerr=1.0;

intcount=0;

while(err>eps&&count

{

sum=0.0;

count++;

err=0.0;

for(i=0;i

{

y[i]=x[i];

}

for(i=0;i

{

x[i]=b[i];

for(j=0;j

{

if(j!

=i)

x[i]-=a[i][j]*y[j];

}

x[i]/=a[i][i];

c[i]=fabs(x[i]-y[i])*fabs(x[i]-y[i]);

sum+=c[i];

}

max=sqrt(sum);

if(err<=max)

err=max;

}

printf("TheresultofXis:

\n");

for(i=0;i

{

printf("%f\n",x[i]);

}

printf("Thenumberofiterationsis:

%d",count);

}

程序说明:

//x[N]为初值

//a[N][N]为矩阵A,即方程系数矩阵

//b[N]为N*1的b矩阵,即方程右边b的值

//eps为允许误差大小

//CNT为设定的迭代最大次数

//N为矩阵的维数

计算习题15的方程组:

主函数为:

#include

#include

#defineN6

voidmain()

{

doublex1[N]={1,1,1,1,1,1};

doublea1[N][N]={4,-1,0,-1,0,0,-1,4,-1,0,-1,0,0,-1,4,0,0,-1,-1,0,0,4,-1,0,0,-1,0,-1,4,-1,0,0,-1,0,-1,4};

doubleb1[N]={0,5,0,6,-2,6};

doubleeps1=1.0e-5;

intCNT1=100;

voidJacobi(doublex[N],doublea[N][N],doubleb[N],doubleeps,intCNT);

Jacobi(x1,a1,b1,eps1,CNT1);

getchar();

}

运行结果为:

TheresultofXis:

1.000000

1.999998

1.000000

1.999998

1.000000

1.999998

Thenumberofiterationsis:

26

2.高斯-塞德尔迭代公式

高斯-塞德尔迭代子程序:

VoidGauss_Seidel(doublex[N],doublea[N][N],doubleb[N],doubleeps,intCNT)

{

inti,j;

doubley[N],c[N],sum,max;

doubleerr=1.0;

intcount=0.0;

while(err>eps&&cou

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

当前位置:首页 > 工程科技 > 电力水利

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

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