东南大学数值分析上机作业,c++
数值分析上机练习
(以VC++6.0为操作平台)
第四章(4.38) 程序如下:
#include<iostream.h> void main(void) {
float x[11];//存放数组x[j] float y[11];//存放数组y[j] float h[11];//存放数组h[j] float u[11];//存放数组u[j] float v[11];//存放数组v[j] float d[11];//存放数组d[j] float M[11];//存放数组M[j] float b[11];// 存放数组b[j]
float t[11],l[11],yy[11],s[4],aa1,aa2,aa3,aa4; float s1[10]; int i,j,n; float xx;
cout<<"请输入n的值:\n"; cin>>n;
cout<<"输入数组x:\n"; for(i=0;i<=n;i++)cin>>x[i]; cout<<"输入数组y:\n"; for(i=0;i<=n;i++)cin>>y[i]; //输入端点值 float df[2];
cout<<"输入两个端点值:\n";
for(i=0;i<2;i++)cin>>df[i];//求出h[j]的值 for(j=0;j<=n-1;j++) {h[j]=x[j+1]-x[j];
cout<<'h'<<'['<<j<<']'<<'='<<h[j]<<'\t'; }
东南大学数值分析上机作业,c++
cout<<endl;
//求出u[j]和v[j]的初值 v[0]=1; u[n]=1;
for(j=1;j<=n-1;j++)
{u[j]=h[j-1]/(h[j-1]+h[j]); v[j]=h[j]/(h[j-1]+h[j]); }
//求出d[j]的值 for(j=1;j<n;j++)
{d[j]=6*((y[j+1]-y[j])/h[j]-(y[j]-y[j-1])/h[j-1])/(h[j]+h[j-1]);} d[0]=6*((y[1]-y[0])/h[0]-df[0])/h[0];
d[n]=6*(df[1]-(y[n]-y[n-1])/h[n-1])/h[n-1]; for(j=1;j<=n;j++) {
cout<<'u'<<'['<<j<<']'<<'='<<u[j]<<'\t'; }
cout<<endl;
for(j=0;j<n;j++) {
cout<<'v'<<'['<<j<<']'<<'='<<v[j]<<'\t'; }
cout<<endl;
for(j=0;j<=n;j++) {
cout<<'d'<<'['<<j<<']'<<'='<<d[j]<<'\t'; }
cout<<endl;
//利用书本上的追赶法求解方程组 for(i=0;i<=n;i++) {b[i]=2;} cout<<endl; t[0]=b[0]; yy[0]=d[0];
东南大学数值分析上机作业,c++
//消元过程
for(i=1;i<=n;i++) {
l[i]=u[i]/t[i-1]; t[i]=b[i]-l[i]*v[i-1]; yy[i]=d[i]-l[i]*yy[i-1]; }
//回代过程
M[n]=yy[n]/t[n]; for(i=n-1;i>=0;i--) {
M[i]=(yy[i]-v[i]*M[i+1])/t[i]; }
//将M[j]的值输出 for(i=0;i<=n;i++)
{cout<<'M'<<'['<<i<<']'<<'='<<M[i]<<endl;} //输出插值多项式的系数 for(j=0;j<n;j++) {
s[0]=y[j];
s[1]=(y[j+1]-y[j])/h[j]-(M[j]/3+M[j+1]/6)*h[j]; s[2]=M[j]/2;
s[3]=(M[j+1]-M[j])/(6*h[j]);
cout<<"当x的值在区间"<<'x'<<'['<<j<<']'<<"到"<<'x'<<'['<<(j+1)<<']'<<"时,输出插值多项式的系数:\n"; for(int k=0;k<4;k++) {
cout<<'s'<<'['<<k<<']'<<'='<<s[k]<<'\t'; }
cout<<endl; } }
东南大学数值分析上机作业,c++
程序结果:详见附图4.38jpg
编制的程序求车门的3次样条插值函数S(x):
x属于区间[0,1]时;
S(x)=2.51+0.8(x)-0.0014861(x)(x)-0.00851395(x)(x)(x) x属于区间[1,2]时;
S(x)=3.3+0.771486(x-1)-0.027028(x-1)(x-1)-0.00445799(x-1)(x-1)(x-1) x属于区间[2,3]时;
S(x)=4.04+0.704056(x-2)-0.0404019(x-2)(x-2)-0.0036543(x-2)(x-2)(x-2) x属于区间[3,4]时;
S(x)=4.7+0.612289(x-3)-0.0513648(x-3)(x-3)-0.0409245(x-3)(x-3)(x-3) x属于区间[4,5]时;
S(x)=5.22+0.386786(x-4)-0.174138(x-4)(x-4)+0.107352(x-4)(x-4)(x-4) x属于区间[5,6]时;
S(x)=5.54+0.360567(x-5)+0.147919(x-5)(x-5)-0.268485(x-5)(x-5)(x-5) x属于区间[6,7]时;
S(x)=5.78-0.149051(x-6)-0.657537(x-6)(x-6)+0.426588(x-6)(x-6)(x-6) x属于区间[7,8]时;
S(x)=5.4-0.184361(x-7)+0.622227(x-7)(x-7)-0.267865(x-7)(x-7)(x-7) x属于区间[8,9]时;
S(x)=5.57+0.256496(x-8)-0.181369(x-8)(x-8)+0.0548728(x-8)(x-8)(x-8) x属于区间[9,10]时;
S(x)=5.7+0.058376(x-9)-0.0167508(x-9)(x-9)+0.0583752(x-9)(x-9)(x-9) S(0.5)=2.90856 S(1.5)=3.67843 S (2.5)=4.38147 S(3.5)=4.98819 S(4.5)=5.38328 S(5.5)=5.7237 S(6.5)=5.59441 S(7.5)=5.42989 S(8.5)=5.65976 S(9.5)=5.7323
东南大学数值分析上机作业,c++
第六章(6.21) 程序如下:
#include<iostream.h> #include<fstream.h> #include<stdlib.h> #include<math.h>
ofstream outfile("data.txt"); //此处定义函数f(x,y)的表达式
//用户可以自己设定所需要求得函数表达式 double f1(double x,double y) {
double f1;
f1=(-1)*x*x*y*y; return f1; }
//此处定义求函数精确解的函数表达式 double f2(double x) {
double f2;
f2=3/(1+x*x*x); return f2; }
//此处为精确求函数解的通用程序
void accurate(double a,double b,double h) {
double x[100],accurate[100]; x[0]=a; int i=0;
outfile<<"输出函数准确值的程序结果:\n"; do{
x[i]=x[0]+i*h;
accurate[i]=f2(x[i]);
outfile<<"accurate["<<i<<"]="<<accurate[i]<<'\n';
东南大学数值分析上机作业,c++
i++;
}while(i<(b-a)/h+1); }
//此处为经典Runge-Kutta公式的通用程序 void RK4(double a,double b,double h,double c) {
int i=0;
double k1,k2,k3,k4; double x[100],y[100]; y[0]=c; x[0]=a;
outfile<<"输出经典Runge-Kutta公式的程序结果:\n"; do {
x[i]=x[0]+i*h; k1=f1(x[i],y[i]);
k2=f1((x[i]+h/2),(y[i]+h*k1/2)); k3=f1((x[i]+h/2),(y[i]+h*k2/2)); k4=f1((x[i]+h),(y[i]+h*k3));
y[i+1]=y[i]+h*(k1+2*k2+2*k3+k4)/6; outfile<<"y"<<"[& …… 此处隐藏:5750字,全部文档内容请下载后查看。喜欢就下载吧 ……