计算机上机报告

更新时间:2024-05-04 15:28:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

计算方法上机实验报告

上课时间:2014-2015学年秋学期,6~14周

一.拉格朗日插值------------------------------------------------------1

二.牛顿插值------------------------------------------------------------3

三.改进欧拉法---------------------------------------------------------5

四.四阶龙格-库塔-----------------------------------------------------7

五.牛顿迭代------------------------------------------------------------9

六.复化Simpson公式------------------------------------------------11

七.Romberg算法------------------------------------------------------14

八. Seidel迭代法------------------------------------------------------17

九. Gauss列主元消去法----------------------------------------------20

一.拉格朗日插值 1.程序代码

#include void Lagrange() {

int i=0;

double a[10],b[10],L,L1,L2,L3,L4,x; cout<<\

for(i=0;i<4;i++) {

cin>>a[i]; }

cout<<\ for(i=0;i<4;i++) {

cin>>b[i]; }

cout<<\ cin>>x;

L1=(x-a[1])*(x-a[2])*(x-a[3])*b[0]/(a[0]-a[1])/(a[0]-a[2])/(a[0]-a[3]);

L2=(x-a[0])*(x-a[2])*(x-a[3])*b[1]/(a[1]-a[0])/(a[1]-a[2])/(a[1]-a[3]);

L3=(x-a[0])*(x-a[1])*(x-a[3])*b[2]/(a[2]-a[0])/(a[2]-a[1])/(a[2]-a[3]);

L4=(x-a[0])*(x-a[1])*(x-a[2])*b[3]/(a[3]-a[0])/(a[3]-a[1])/(a[3]-a[2]);

L=L1+L2+L3+L4; cout<<\}

void main() {

Lagrange(); cout<

}

2.例子

3.运行结果

二.牛顿插值 1.程序代码

#include #include void main() {

int n,i,j;

double A[50][50],*x,*y; cout<<\请输入插值节点数:\ cin>>n;

x=new double[n]; y=new double[n];

cout<<\请输入这\个插值节点(xi,yi):\ for(i=0;i<=n-1;i++) cin>>x[i]>>y[i]; double K=1,xx,N=0,P; for(i=0;i<=n-1;i++) {

A[i][0]=x[i]; A[i][1]=y[i]; }

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

for(i=1;i<=n-1;i++) {

A[i][j]=(A[i][j-1]-A[i-1][j-1])/(A[i][0]-A[i-j+1][0]); }

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

cout<<\输出第\阶差商为:\ cout<<\请输入预求值x=\ cin>>xx;

for(i=0;i

K*=xx-x[i];

N+=A[i+1][i+2]*K; P=A[0][1]+N; }

cout<<\插值结果为:y=\ getch(); }

2.例子

3.运行结果

三.改进欧拉法 1.程序代码

#include #include

double fun(double x,double y) {

return(-0.9*y/(1+2*x)); }

void main() {

double a,b,*y,h,*x,yp,yc; int n,k;

cout<<\常微分方程为y'=-0.9*y/(1+2*x)\ cout<<\其中0<=x<=1\ cout<<\初值为y(0)=1\ cout<<\请输入计算区间(a,b):\ cin>>a>>b;

cout<<\请输入步长h:\ cin>>h;

cout<<\请输入计算次数:\ cin>>n;

y=new double[n]; x=new double[n];

cout<<\请输入初值y(0)=\ cin>>y[0]; x[0]=a;

for(k=0;k<=n;k++) {

yp=y[k]+h*fun(x[k],y[k]); yc=y[k]+h*fun(x[k]+h,yp); y[k+1]=0.5*(yp+yc); x[k+1]=x[k]+h; }

cout<<\迭代结果为:\ for(k=0;k<=n;k++)

cout<<\ getch(); }

2.例子

3.运行结果

四.四阶龙格-库塔 1.程序代码

#include #include

double fun(double x,double y) {

return(x-y); }

void main() {

double a,b,*y,h,x,k1,k2,k3,k4; int n,k;

cout<<\常微分方程为y'=x-y\ cout<<\其中0<=x<=1\ cout<<\初值为y(0)=0\ cout<<\请输入计算区间(a,b):\ cin>>a>>b;

cout<<\请输入步长h:\ cin>>h;

cout<<\请输入计算次数:\ cin>>n;

y=new double[n];

cout<<\请输入初值y(0):\ cin>>y[0]; x=a;

cout<<\迭代法结果为:\ cout<<\ for(k=0;k<=n-1;k++) {

k1=fun(x,y[k]);

k2=fun(x+h/2,y[k]+k1*h/2); k3=fun(x+h/2,y[k]+k2*h/2); k4=fun(x+h,y[k]+k3*h);

y[k+1]=y[k]+(h/6)*(k1+2*(k2+k3)+k4);

cout<<\ x=x+h; }

getch(); }

2.例子

3.运行结果

五.牛顿迭代法 1.程序代码(C++代码)

#include #include

using namespace std;

double newtondiedai(double a,double b,double c,double d,double x); int main() {

double a,b,c,d; double x=1.5;

cout<<\请依次输入方程四个系数:\cin>>a>>b>>c>>d;

x=newtondiedai(a,b,c,d,x); cout<

double newtondiedai(double a,double b,double c,double d,double x) {

while(abs(a*x*x*x+b*x*x+c*x+d)>0.000001) {

x=x-(a*x*x*x+b*x*x+c*x+d)/(3*a*x*x+2*b*x+c); }

return x; }

2.例子

3.运行结果

六.复化Simpson公式 1.程序代码(C++代码)

#include #include

double function1(double x)//被积函数 {

double s; s=x/(4+x*x); return s; }

double function2(double x)//被积函数 {

double s; s=sqrt(x); return s; }

double ReiterationOfSimpson(double a,double b,double n,double f(double x))//复化Simpson公式 {

double h,fa,fb,xk,xj; h=(b-a)/n; fa=f(a); fb=f(b);

double s1=0.0; double s2=0.0;

for(int k=1;k

xk=a+k*h; s1=s1+f(xk); }

for(int j=0;j

xj=a+(j+0.5)*h; s2=s2+f(xj); }

double sn;//和

sn=h/6*(fa+fb+2*s1+4*s2);//复化Simpson公式 return sn; }

main()

{double a,b,Result,n;

cout<<\请输入积分下限:\ cin>>a;

cout<<\请输入积分上限:\ cin>>b;

cout<<\请输入分割区间数n:\ cin>>n;

cout<<\复化Simpson公式计算结果:\

Result=ReiterationOfSimpson(a, b, n,function1); cout<

2.例子 (I??06x4?x2dx(n?3))

3.运行结果

七.Romberg算法 1.程序代码(C++代码)

#include #include

using namespace std;

#define f(x) (4/(1+x*x)) #define epsilon 0.0001 #define MAXREPT 10

double Romberg(double aa,double bb) { int m,n; double h,x; double s,q; double ep;

double *y =new double[MAXREPT]; double p; h=bb-aa;

y[0]=h*(f(aa)+f(bb))/2.0; m=1; n=1;

ep=epsilon+1.0;

while((ep>=epsilon)&&(m

for(int i=0;i

p=(y[0] + h*p)/2.0; s=1.0;

for(int k=1;k<=m;k++) { s=4.0*s;

q=(s*p-y[k-1])/(s-1.0); y[k-1]=p; p=q; }

p=fabs(q-y[m-1]); m=m+1; y[m-1]=q;

n=n+n;h=h/2.0; }

return (q); }

int main()

{double a,b;

cout<<\积分,请输入积分范围a,b:\ cin>>a>>b;

cout<<\积分结果:\ system(\ return 0; }

2.例子(I??1?014x2dx)

3.运行结果

八.Seidel迭代法 1.程序代码(C++代码)

# include # include # define max 100 # define EPS 1e-6

float a[3][3]={{10,-1,-2},{-1,10,-2},{-1,-1,5}}; float b[3]={7.2,8.3,4.2}; float x[3]={0,0,0}; float y[3]; float S(int m) {int n; float S=0; float y;

for(n=0;n<3;n++) {if(m==n){} else

{S+=a[m][n]*x[n]; }

}y=(b[m]-S)/a[m][m]; return y; }

void main() {int i;

int F,T=1,k=1; do {F=0; if(T) {T=0;} else {k++;

for(i=0;i<3;i++) {x[i]=y[i]; } }

for(i=0;i<3;i++) {y[i]=S(i); }

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

{if(fabs(x[i]-y[i])>EPS) {F=1; }

}printf(\

}while(((F==1)&&k!=max)); printf(\迭代次数:%d\\n\ for(i=0;i<3;i++)

{printf(\} }

?10x1?x2?2x3?7.22.例子(???x1?10x2?2x3?8.3)

??x1?x2?5x3?4.2?

3.运行结果

九.Gauss列主元消去法 1.程序代码(C++代码)

#include #include #include

#define max_dimension 20 int n;

static float a[max_dimension][max_dimension]; static float b[max_dimension]; static float x[max_dimension]; void main() {int i; int j; int d; int row; float temp;

float known_items;

float l[max_dimension][max_dimension]; printf(\请输入阶数:\scanf(\printf(\

printf(\请输入系数矩阵的值: \printf(\

for(i=0; i

{ printf(\输入第%d行的值:\ for (j=0; j

scanf(\ }

printf(\}

printf(\请输入常数项的值: \for(i=0; i

for(d=0; d

for(i=d+1; i

{if(fabs(a[i][d])>fabs(a[row][d])) row=i; }

if(row!=d)

{for(j=d; j

temp=b[row]; b[row]=b[d]; b[d]=temp; }

for(i=d+1; i

{l[i][d]=-a[i][d]/a[d][d]; for (j=d; j

{a[i][j]=a[i][j]+a[d][j]*l[i][d]; }

b[i]=b[i]+b[d]*l[i][d]; } }

printf(\

for (i=n-1; i>-1; i--) {known_items=0;

for(j=1; j

{known_items=known_items+a[i][i+j]*x[i+j]; }

x[i]=(b[i]-known_items)/a[i][i]; }

printf(\方程组的根为:\\n\\n\for(i=0; i

printf(\printf(\getch(); }

2.例子

3.运行结果

本文来源:https://www.bwwdw.com/article/t7hg.html

Top