积分方程的计算

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(1):方程:

取x的范围为[0,10),a=0,b=5;

求解步骤:

1、对s进行离散,取,将[0,5]中每隔0.01取的数以此记为(i=0,1,2,3….500),即有

2、对x进行离散,也取,将[0,10)中每隔0.01取的数以此记为(i=0,1,2,3….999)对于所取的任意有

写成矩阵的形式为

对于全部的,可写成:

1000

说明:s的范围可以为x的取值范围,也可以比x的取值范围小,当s的取值范围比x的取值范围小时,可以像上式那样将等式右边第二项的系数矩阵中s取不到的值令k=0,s和x的范围相等仅仅是一种特殊情况。

3、上式可化成F-KF=G的形式,进一步化成AF=G的形式,对其用doolittle分解法求解,可等到一系列离散值。

求解过程中取a=0,b=5,x的范围为[0,10),,

,的理论值应为; C++程序如下:

#include

#include

#include

double

a[1000][1000],b[1000][1000],u[1000][1000],l[ 1000][1000],y[1000],f[1000];

double m=2.0;

double ds=0.01;

double si,xj,k,g,xo,gg;

double kx(double s,double x)

{

k=s*x*x;

return k;

}

double gx(double x)

{

g=x*x*(-103.1667)-4*x+5;

return g;

}

void main()

{

fstream outfile;

outfile.open("jifenshi.dat",ios::out);

for (int j=0;j<1000;j++)

{

xj=j;

for (int i=0;i<=500;i++)

{

si=i;

a[j][i]=m*ds*kx(si/100,xj/100);

}

}

for (int jj=0;jj<1000;jj++)

{

for (int ii=0;ii<1000;ii++)

{

if (ii==jj)

b[jj][ii]=1-a[jj][ii];

else

b[jj][ii]=-a[jj][ii];

}

}

for (int c=0;c<1000;c++) //doolittle {

u[0][c]=b[0][c];

l[c][0]=b[c][0]/u[0][0];

}

for (int d=1;d<1000;d++)

{

for (int e=d;e<1000;e++)

{

double ff=0;

for (int f=0;f<=d-1;f++)

{

ff+=l[d][f]*u[f][e];

}

u[d][e]=b[d][e]-ff;

}

for (int h=d;h<1000;h++)

{

double nn=0;

for (int n=0;n<=d-1;n++)

{

nn+=l[h][n]*u[n][d];

}

l[h][d]=(b[h][d]-nn)/u[d][d];

}

}

y[0]=gx(0);

for (int o=1;o<1000;o++)

{

xo=o;

gg=gx(xo/100);

double pp=0;

for (int p=0;p<=o-1;p++)

{

pp+=l[o][p]*y[p];

}

y[o]=gg-pp;

}

f[999]=y[999]/u[999][999];

for (int q=998;q>=0;q--)

{

double tt=0;

for (int t=q+1;t<1000;t++)

{

tt+=u[q][t]*f[t];

}

f[q]=(y[q]-tt)/u[q][q];

}

for (int z=0;z<1000;z++)

{

outfile<

}

outfile.close();

}

得出的的一系列离散值与理论值在matlab中成图如下:由图可看出两者相差比较小

数值计算所得的值与理论值的相对误差图

分析:离散的时候步长取的越小,相对误差越小,另外,我在一开始取定和模型时由此算出函数,此函数系数为小数,在取的时候进行了一定的近似处理,因此在由和算时产生了一定的人为误差。

(2):方程:

取t的范围为[0,10);

求解时将等式右边进行离散,取,将[0,t]中每隔0.1取的数以此记为(i=0,1,2,3…),即有

求解过程中我取,,其理论的

其c++程序如下:

#include

#include

#include

double q[100];

double k,f,mm;

double kx(double s,double t) {

k=s*t+t;

return k;

}

double fx(double s)

{

相关文档
最新文档