数值分析源代码.docx

上传人:b****5 文档编号:6281172 上传时间:2023-01-05 格式:DOCX 页数:13 大小:17.16KB
下载 相关 举报
数值分析源代码.docx_第1页
第1页 / 共13页
数值分析源代码.docx_第2页
第2页 / 共13页
数值分析源代码.docx_第3页
第3页 / 共13页
数值分析源代码.docx_第4页
第4页 / 共13页
数值分析源代码.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数值分析源代码.docx

《数值分析源代码.docx》由会员分享,可在线阅读,更多相关《数值分析源代码.docx(13页珍藏版)》请在冰豆网上搜索。

数值分析源代码.docx

数值分析源代码

一,三次样条插值

#include

#include

voidready(double*&A,double*&B,double*h,double*y,intm,intn,doublem0=0,doublemn=0)

{A=newdouble[n];B=newdouble[n];

if(m==2){

A[0]=0;B[0]=2*m0;

A[n]=1;B[n]=2*mn;

}

else{A[0]=1;B[0]=3*(y[1]-y[0])/h[0];

A[n]=0;B[n]=3*(y[n]-y[n-1])/h[n-1];

}

for(inti=1;i

{A[i]=h[i-1]/(h[i-1]+h[i]);

B[i]=3*((1-A[i])*(y[i]-y[i-1])/h[i-1]+A[i]*(y[i+1]-y[i])/h[i]);

}

}

voidcalculate1(double*&a,double*&b,double*A,double*B,intn)

{a=newdouble[n];b=newdouble[n];

a[0]=-A[0]/2;b[0]=B[0]/2;

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

{a[i]=-A[i]/(2+(1-A[i])*a[i-1]);

b[i]=(B[i]-(1-A[i])*b[i-1])/(2+(1-A[i])*a[i-1]);

}

}

voidcalculate2(double*&m,double*a,double*b,intn)

{m=newdouble[n+1];

m[n+1]=0;

for(inti=n;i>=0;i--)m[i]=m[i+1]*a[i]+b[i];

}

voidmain()

{inte,t,w,v;

out:

cout<<"求三次样条插值函数:

"<

"<

cin>>e;

double*x,*y,*h,*A,*B,*a,*b,*m,s0,sn,u,s;

cout<<"请输入x的一系列值:

"<

x=newdouble[e];

for(inti=0;i>x[i];

cout<<"请输入y的一系列值:

"<

y=newdouble[e];

for(intf=0;f>y[f];

h=newdouble[e];

for(intd=0;d

loop:

cout<<"边界条件选择:

1.提供了s\"(x1)=0,s\"(x2)=0;2.提供了s'(x0)=m0,s'(xn)=mn(m0,mn!

=0)"

<

cin>>t;

if(t!

=1&&t!

=2){cout<<"输入信息错误!

请重新输入!

"<

if(t==1)ready(A,B,h,y,t,e);

else{cout<<"请输入s'(x0),s'(xn)的值:

"<

cin>>s0>>sn;

ready(A,B,h,y,t,e,s0,sn);}

calculate1(a,b,A,B,e);

calculate2(m,a,b,e);

in:

cout<<"请输入所需要计算的x的值:

("<

cin>>u;

if(ux[e-1]){cout<<"输入数据错误!

"<

for(intc=0;c

{if(u>x[c]&&u

s=(1+2*(u-x[w])/(x[w+1]-x[w]))*((u-x[w+1])*(u-x[w+1])/((x[w]-x[w+1])*(x[w]-x[w+1])))*y[w]+

(1+2*(u-x[w+1])/(x[w]-x[w+1]))*((u-x[w])*(u-x[w])/((x[w+1]-x[w])*(x[w+1]-x[w])))*y[w+1]+

(u-x[w])*((u-x[w+1])*(u-x[w+1])/((x[w]-x[w+1])*(x[w]-x[w+1])))*m[w]+

(u-x[w+1])*((u-x[w])*(u-x[w])/((x[w+1]-x[w])*(x[w+1]-x[w])))*m[w+1];

cout<<"f("<

"<

In:

cout<<"请选择:

1,继续进行新的操作计算2,退出不计算"<

cin>>v;

if(v!

=1&&v!

=2){cout<<"输入错误!

请重新输入!

"<

if(v==1){system("cls");gotoout;}

}

运行结果:

根据课本52页的数据输入,得:

第9题:

f(78.3)=3.00304

第10题:

f(0.35)=0.591591

 

二,自动选取步长梯形法

#include

#include

#include

doublef(doublex)

{return2/(1+x*x);}

voidmain()

{doublea,b,e,h,T0,T1,S;

out:

cout<<"请输入区间上下界:

a和b"<

cin>>a>>b;

cout<<"请输入给定的精度e:

"<

cin>>e;

h=(b-a)/2;

T1=(f(a)+f(b))*h;

intn=1,t,v;

do

{T0=T1;

S=0;

for(intk=1;k

S=S+f(a+(2*k-1)*h/n);

T1=T0/2+S*h/n;

t=n;

if(fabs(T1-T0)>=3*e)n=2*n;

}while(t==n);

cout<<"该积分的近似值为:

"<

In:

cout<<"请选择:

1,继续进行新的操作计算2,退出不计算"<

cin>>v;

if(v!

=1&&v!

=2){cout<<"输入错误!

请重新输入!

"<

if(v==1){system("cls");gotoout;}

}

运行结果:

根据课本97页第7题的数据输入,得结果为:

0.75

三,Romberg求积分法

#include

#include

#include

usingnamespacestd;

doublef(doublex)

{returnsqrt(x);}

voidmain()

{doublea,b,e,T[20][20],S=0,s;intk=1,v;

out:

cout<<"请输入区间上下界:

a和b"<

cin>>a>>b;

cout<<"请输入给定的精度e:

"<

cin>>e;

T[0][0]=(b-a)*(f(a)+f(b))/2;

do

{for(inti=1;double(i)<=pow(2,double(k))-1;i++)

{S=S+f(a+(2*i-1)*(b-a)/pow(2,double(k)));}

T[0][k]=0.5*(T[0][k-1]+(b-a)*S/pow(2,double(k)-1));

for(intm=1;m<=k;m++)

{T[m][k-m]=(T[m-1][k-m+1]*pow(4,double(m))-T[m-1][k-m])/(pow(4,double(m))-1);}

s=k;

if(fabs(T[k][0]-T[k-1][0])>=e)k=k+1;

}while(s!

=k);

cout<<"该积分的近似值为:

"<

In:

cout<<"请选择:

1,继续进行新的操作计算2,退出不计算"<

cin>>v;

if(v!

=1&&v!

=2){cout<<"输入错误!

请重新输入!

"<

if(v==1){system("cls");gotoout;}

}

运行结果:

根据课本97页第8题的数据输入(输入a=1,b=9,e=0.000001),得结果为:

92.121

四,列主元高斯消去法

#include

#include

#include

usingnamespacestd;

voidmain()

{intn,v;

out:

cout<<"请输入系数矩阵A的行列数n:

"<

cin>>n;

doubleA[10][10],*b=newdouble[n],*x=newdouble[n],e,T;inti1;

cout<<"请输入系数矩阵A的值:

"<

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

{

for(intj=1;j<=n;j++)

cin>>A[i][j];

}

cout<<"系数矩阵A为:

"<

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

{

for(intj=1;j<=n;j++)

cout<

cout<

}

cout<<"请输入方程组的右端项b:

"<

for(inti=1;i<=n;i++)cin>>b[i];

cout<<"右端项b为:

"<

for(inti=1;i<=n;i++)cout<

cout<

cout<<"请输入精度值e:

"<

cin>>e;

for(intk=1;k

{doublemax=fabs(A[k][k]);

for(inti=k;i<=n;i++)

{

if(fabs(A[i][k])>max){max=fabs(A[i][k]);i1=i;}

}

T=max;

if(T

"<

if(i1!

=k)

{doubletemp1;

for(intk1=1;k1<=n;k1++)

{doubletemp;

temp=A[i1][k1];

A[i1][k1]=A[k][k1];

A[k][k1]=temp;

}

temp1=b[i1];

b[i1]=b[k];

b[k]=temp1;

}

for(inti=k+1;i<=n;i++)

{

T=A[i][k]/A[k][k];

b[i]=b[i]-T*b[k];

for(intj=k+1;j<=n;j++)

A[i][j]=A[i][j]-T*A[k][j];

}

}

if(fabs(A[n][n])<=e){cout<<"求解失败!

"<

x[n]=b[n]/A[n][n];

for(inti=n-1;i>=1;i--)

{doublesum=0;

for(intj=i+1;j<=n;j++)sum+=A[i][j]*x[j];

x[i]=(b[i]-sum)/A[i][i];

}

for(inti=1;i<=n;i++)cout<

cout<

stop:

;

In:

cout<<"请选择:

1,继续进行新的操作计算2,退出不计算"<

cin>>v;

if(v!

=1&&v!

=2){cout<<"输入错误!

请重新输入!

"<

if(v==1){system("cls");gotoout;}}

运行结果:

根据课本126页第1题的数据输入,

系数矩阵为235右端项为5精度为0.00001;

3476

1335

结果为-4

1

2

五,迭代法--Jacobi迭代与Seidel迭代

#include

#include

#include

usingnamespacestd;

voidJacobi();

voidSeidel();

voidmain()

{intw,v;

out:

loop:

cout<<"请选择所要的迭代方式:

1,Jacobi迭代2,Seidel迭代"<

cin>>w;

switch(w)

{

case1:

Jacobi();break;

case2:

Jacobi();break;

default:

{cout<<"输入数据错误!

请重新输入!

"<

}

In:

cout<<"请选择:

1,继续进行新的操作计算2,退出不计算"<

cin>>v;

if(v!

=1&&v!

=2){cout<<"输入错误!

请重新输入!

"<

if(v==1){system("cls");gotoout;}

}

voidJacobi()

{intn,k;

cout<<"请输入系数矩阵A的行数n:

"<

cin>>n;

doubleA[10][10],*b=newdouble[n],*x=newdouble[n],*y=newdouble[n],*g=newdouble[n],e,T;intM;

cout<<"请输入系数矩阵A的值:

"<

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

{

for(intj=1;j<=n;j++)

cin>>A[i][j];

}

cout<<"系数矩阵A为:

"<

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

{

for(intj=1;j<=n;j++)

cout<

cout<

}

cout<<"请输入方程组的右端项b:

"<

for(inti=1;i<=n;i++)cin>>b[i];

cout<<"右端项b为:

"<

for(inti=1;i<=n;i++)cout<

cout<

cout<<"请输入容许误差e:

"<

cin>>e;

cout<<"请输入容许最大迭代次数M:

"<

cin>>M;

cout<<"请输入初始向量Y:

"<

for(inti=1;i<=n;i++)cin>>y[i];

k=1;

//--------形成迭代矩阵-------

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

{

if(fabs(A[i][i])

"<

T=A[i][i];

for(intj=1;j<=n;j++)A[i][j]=-A[i][j]/T;

A[i][i]=0;

g[i]=b[i]/T;

}

//--------迭代--------

loop:

doublesum=0;

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

{

for(intj=1;j<=n&&j!

=i;j++)sum+=(A[i][j]*y[j]);

x[i]=g[i]+sum;

}

doublefanshu=0;

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

{

fanshu+=fabs(x[i]-y[i]);

}

if(fanshu

{for(inti=1;i<=n;i++)cout<

cout<

}

elseif(k

elsecout<<"求解失败!

"<

stop:

;}

voidSeidel()

{

intn,k;

cout<<"请输入系数矩阵A的行数n:

"<

cin>>n;

doubleA[10][10],*b=newdouble[n],*x=newdouble[n],*y=newdouble[n],*g=newdouble[n],e,T;intM;

cout<<"请输入系数矩阵A的值:

"<

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

{

for(intj=1;j<=n;j++)

cin>>A[i][j];

}

cout<<"系数矩阵A为:

"<

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

{

for(intj=1;j<=n;j++)

cout<

cout<

}

cout<<"请输入方程组的右端项b:

"<

for(inti=1;i<=n;i++)cin>>b[i];

cout<<"右端项b为:

"<

for(inti=1;i<=n;i++)cout<

cout<

cout<<"请输入容许误差e:

"<

cin>>e;

cout<<"请输入容许最大迭代次数M:

"<

cin>>M;

cout<<"请输入初始向量Y:

"<

for(inti=1;i<=n;i++)cin>>y[i];

k=1;

for(inti=1;i<=n;i++)x[i]=y[i];

//--------形成迭代矩阵-------

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

{

if(fabs(A[i][i])

"<

T=A[i][i];

for(intj=1;j<=n;j++)A[i][j]=-A[i][j]/T;

A[i][i]=0;

g[i]=b[i]/T;

}

//--------迭代--------

loop:

doublesum=0;

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

{

for(intj=1;j<=n&&j!

=i;j++)sum+=(A[i][j]*x[j]);

x[i]=g[i]+sum;

}

doublefanshu=0;

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

{

fanshu+=fabs(x[i]-y[i]);

}

if(fanshu

{for(inti=1;i<=n;i++)cout<

cout<

}

elseif(k

elsecout<<"求解失败!

"<

stop:

;

}

运行结果:

根据课本139页第1题的数据输入,

简单迭代:

x1=1.2,x2=1.4,x3=1.6,x4=0.79999

Seidel迭代:

x1=1.2,x2=1.4,x3=1.6,x4=0.79999

 

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

当前位置:首页 > 工作范文 > 演讲主持

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

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