计算机强化训练报告
课 题: Linux系统基础知识
学 院:
班 级:
姓 名:
学 号:
气 学 院 09 电子 王 成 09020618 常州工学院 电
计算机强化训练报告
课 题: Linux系统基础知识
学 院:
班 级:
姓 名:
学 号:
气 学 院 09 电子 于贝贝 09020632 常州工学院 电
第二篇:计算机上机报告
计算方法上机实验报告
上课时间:20##-2015学年秋学期,6~14周
一.拉格朗日插值------------------------------------------------------1
二.牛顿插值------------------------------------------------------------3
三.改进欧拉法---------------------------------------------------------5
四.四阶龙格-库塔-----------------------------------------------------7
五.牛顿迭代------------------------------------------------------------9
六.复化Simpson公式------------------------------------------------11
七.Romberg算法------------------------------------------------------14
八. Seidel迭代法------------------------------------------------------17
九. Gauss列主元消去法----------------------------------------------20
一.拉格朗日插值
1.程序代码
#include<iostream.h>
void Lagrange()
{
int i=0;
double a[10],b[10],L,L1,L2,L3,L4,x;
cout<<"x=";
for(i=0;i<4;i++)
{
cin>>a[i];
}
cout<<"y=";
for(i=0;i<4;i++)
{
cin>>b[i];
}
cout<<"x=";
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<<"L="<<L;
}
void main()
{
Lagrange();
cout<<endl;
}
2.例子
3.运行结果
二.牛顿插值
1.程序代码
#include <iostream.h>
#include<conio.h>
void main()
{
int n,i,j;
double A[50][50],*x,*y;
cout<<"请输入插值节点数:";
cin>>n;
x=new double[n];
y=new double[n];
cout<<"请输入这"<<n<<"个插值节点(xi,yi):"<<endl;
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<<"输出第"<<i+1<<"阶差商为:"<<A[i][i+1]<<endl;
cout<<"请输入预求值x=";
cin>>xx;
for(i=0;i<n-1;i++)
{
K*=xx-x[i];
N+=A[i+1][i+2]*K;
P=A[0][1]+N;
}
cout<<"Newton插值结果为:y="<<P<<endl;
getch();
}
2.例子
3.运行结果
三.改进欧拉法
1.程序代码
#include<iostream.h>
#include<conio.h>
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)"<<endl;
cout<<"其中0<=x<=1"<<endl;
cout<<"初值为y(0)=1"<<endl;
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<<"迭代结果为:"<<endl;
for(k=0;k<=n;k++)
cout<<"x"<<k<<"="<<x[k]<<'\t'<<"y"<<k<<"="<<y[k]<<endl;
getch();
}
2.例子
3.运行结果
四.四阶龙格-库塔
1.程序代码
#include<iostream.h>
#include<conio.h>
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"<<endl;
cout<<"其中0<=x<=1"<<endl;
cout<<"初值为y(0)=0"<<endl;
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<<"Runge-Kutta迭代法结果为:"<<endl;
cout<<"x0="<<x<<'\t'<<"y0="<<y[0]<<endl;
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"<<k+1<<"="<<x+h<<'\t'<<"y"<<k+1<<"="<<y[k+1]<<endl;
x=x+h;
}
getch();
}
2.例子
3.运行结果
五.牛顿迭代法
1.程序代码(C++代码)
#include<iostream>
#include<cmath>
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<<x<<endl;
return 0;
}
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<iostream.h>
#include<math.h>
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<n;k++)
{
xk=a+k*h;
s1=s1+f(xk);
}
for(int j=0;j<n;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<<"请输入积分下限:"<<endl;
cin>>a;
cout<<"请输入积分上限:"<<endl;
cin>>b;
cout<<"请输入分割区间数n:"<<endl;
cin>>n;
cout<<"复化Simpson公式计算结果:";
Result=ReiterationOfSimpson(a, b, n,function1);
cout<<Result<<endl;
}
2.例子 ()
3.运行结果
七.Romberg算法
1.程序代码(C++代码)
#include<iostream>
#include<cmath>
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<MAXREPT))
{ p =0.0;
for(int i=0;i<n;i++)
{ x=aa+(i+0.5)*h;
p=p+f(x);
}
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<<"Romberg积分,请输入积分范围a,b:"<<endl;
cin>>a>>b;
cout<<"积分结果:"<<Romberg(a,b)<<endl;
system("pause");
return 0;
}
2.例子()
3.运行结果
八.Seidel迭代法
1.程序代码(C++代码)
# include <math.h>
# include <stdio.h>
# 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("%d\n",k);
}while(((F==1)&&k!=max));
printf("迭代次数:%d\n",k);
for(i=0;i<3;i++)
{printf("x[%d]=%1.6f\n",i,y[i]);
}
}
2.例子()
3.运行结果
九.Gauss列主元消去法
1.程序代码(C++代码)
#include <stdio.h>
#include<conio.h>
#include <math.h>
#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("%d",&n);
printf("\n");
printf("请输入系数矩阵的值: ");
printf("\n");
for(i=0; i<n; i++)
{ printf("输入第%d行的值:",i+1);
for (j=0; j<n; j++)
{
scanf("%f",&a[i][j]);
}
printf("\n");
}
printf("请输入常数项的值: ");
for(i=0; i<n; i++)
scanf("%f",&b[i]);
printf("\n");
for(d=0; d<n-1; d++)
{row=d;
for(i=d+1; i<n; i++)
{if(fabs(a[i][d])>fabs(a[row][d]))
row=i;
}
if(row!=d)
{for(j=d; j<n; j++)
{temp=a[row][j];
a[row][j]=a[d][j];
a[d][j]=temp;
}
temp=b[row];
b[row]=b[d];
b[d]=temp;
}
for(i=d+1; i<n; i++)
{l[i][d]=-a[i][d]/a[d][d];
for (j=d; j<n; j++)
{a[i][j]=a[i][j]+a[d][j]*l[i][d];
}
b[i]=b[i]+b[d]*l[i][d];
}
}
printf("\n");
for (i=n-1; i>-1; i--)
{known_items=0;
for(j=1; j<n-i; 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<n; i++)
printf("%.5f ",x[i]);
printf("\n\n");
getch();
}
2.例子
3.运行结果