• 数值计算方法习题解答

    数值计算方法习题解答第二版。机械工业出版社

    0
    0
    8.33MB
    2012-06-12
    25
  • c++追赶法代码

    #include <iostream> using namespace std; class chasing { int m; float *a,*b,*c,*d,*l,*u,*y,*x; public: chasing(); void get_l(); void get_y(); void get_x(); ~chasing(); }; void main() { chasing zgf; zgf.get_l(); zgf.get_y(); zgf.get_x(); } chasing::chasing() { cout<<"请输入方程个数:"; cin>>m; a=new float[m-1]; b=new float[m]; c=new float[m-1]; d=new float[m]; l=new float[m]; u=new float[m-1]; y=new float[m]; for(int i=0;i<m;i++) { cout<<"输入b["<<i<<"]:"; cin>>b[i]; } for(i=0;i<m-1;i++) { cout<<"输入a["<<i<<"]:"; cin>>a[i]; } for(i=0;i<m-1;i++) { cout<<"输入c["<<i<<"]:"; cin>>c[i]; } for(i=0;i<m;i++) { cout<<"输入d["<<i<<"]:"; cin>>d[i]; } } void chasing::get_l() { l[0]=b[0]; for(int i=0;i<m-1;i++) { u[i]=c[i] / l[i]; l[i+1]=b[i+1] - (a[i] * u[i]); } } void chasing::get_y() { y[0]=d[0] / l[0]; for(int i=1;i<m;i++) { y[i]=(d[i]-a[i-1]*y[i-1]) / l[i]; } } void chasing::get_x() { float *x=new float[m]; x[m-1]=y[m-1]; for(int i=m-2;i>=0;i--) { x[i]=y[i]-u[i] * x[i+1]; } cout<<"方程组的解为:"<<endl; for(i=0;i<m;i++) { cout<<"x"<<i+1<<"="; cout<<x[i]<<endl; } } chasing::~chasing() { delete []a; delete []b; delete []c; delete []d; delete []l; delete []u; delete []x; delete []y; }

    0
    606
    1KB
    2012-06-12
    50
  • 三次样条插值

    #include <iostream> #include <fstream> #include <cmath> using namespace std; class scyt {private: int i,n; double s;//插入点的计算值 double X;//输入的插入点 double z1,z2;//起点和终点的一阶导数值 double *xx,*yy,*a,*b,*c,*f,*h;//b用来存主对角线上的值, //a,c用来存下,上次对角线上的值 double *x,*y,*l,*u;//求解三对角方程所需元素 public: void input();//数据输入 void qiudao();//求二阶导数 void sdj();//解三对角方程 void jscrd();//计算插入点的值 ~scyt()//释放内存 {delete []xx,yy,a,b,c,h,x,y,l,u,f;} }; void main() {scyt myscyt; myscyt.input();//读入x,y数据 myscyt.qiudao();//计算二阶导数 myscyt.jscrd();//计算插入点的值 } void scyt::input()//读入x,y数据 {ifstream fin("ty.dat"); fin>>n; xx=new double[n]; yy=new double[n]; for(i=0;i<n;i++) {fin>>xx[i]>>yy[i];} fin>>z1>>z2; fin.close(); } void scyt::qiudao()//求二阶导数 {a=new double[n-1]; b=new double[n]; c=new double[n-1]; f=new double[n]; h=new double[n-1]; for(i=0;i<n-1;i++) {h[i]=xx[i+1]-xx[i];} a[n-2]=1; c[0]=1; for(i=0;i<n-2;i++) {a[i]=h[i]/(h[i]+h[i+1]);} for(i=0;i<n;i++) {b[i]=2;} for(i=1;i<n-1;i++) {c[i]=1-a[i-1];} f[0]=(6/h[0])*((yy[1]-yy[0])-z1); f[n-1]=(6/h[n-2])*(z2-(yy[n-1]-yy[n-2])/h[n-2]); for(i=1;i<n-1;i++) {f[i]=(6/(h[i-1]+h[i]))*((yy[i+1]-yy[i])/h[i]-\ (yy[i]-yy[i-1])/h[i-1]);} sdj(); } void scyt::sdj()//解三对角方程 {x=new double[n]; y=new double[n]; l=new double[n]; u=new double[n-1]; l[0]=b[0]; for(i=0;i<=n-2;i++) {u[i]=c[i]/l[i]; l[i+1]=b[i+1]-a[i]*u[i];}//求下三角中的l[i]和上三角中的u[i] y[0]=f[0]/l[0]; for(i=1;i<n;i++) {y[i]=(f[i]-a[i-1]*y[i-1])/l[i];} x[n-1]=y[n-1]; for(i=n-2;i>=0;i--) {x[i]=y[i]-u[i]*x[i+1];} cout<<n<<"个点的导数值分别是:"<<endl; for(i=0;i<n;i++) cout<<"x["<<i<<"]="<<x[i]<<" "; } void scyt::jscrd() {cout<<"\n"<<"请输入插入点的值X,当X=1000时退出程序!"<<endl; while(X!=1000) {cout<<"X=:"; cin>>X; if(X!=1000) {for(i=0;i<n-1;i++) {if(xx[i]<=X&&xx;[i+1]>=X) break; } s=pow((xx[i+1]-X),3)*x[i]/(6*h[i])+pow\ ((X-xx[i]),3)*x[i+1]/(6*h[i])+\ (xx[i+1]-X)*(yy[i]-h[i]*h[i]*x[i]/6)/h[i]\ +(X-xx[i])*(yy[i+1]-h[i]*h[i]*x[i+1]/6)/h[i]; cout<<"s["<<X<<"]="<<s<<endl; } } }

    0
    106
    2KB
    2012-06-12
    9
  • 三次样条插值代码

    #include <iostream> #include <cmath> #include <fstream> using namespace std; class scyt { float *x,*y,*d,*h,*u,*q,*a,*b,*c,*l,*r,*o,*M; int m; float y0,y3; public: scyt(); void qiudao(); void zgf(); void qiujie(); ~scyt(); }; void main() { scyt hello; hello.qiudao(); hello.zgf(); hello.qiujie(); } scyt::scyt() { ifstream fin("三次样条插值.txt"); for(float j;fin>>j;) { m=int(j); break; } x=new float[m]; y=new float[m]; d=new float[m]; h=new float[m-1]; u=new float[m-2]; q=new float[m-2]; a=new float[m-1]; b=new float[m]; c=new float[m-1]; l=new float[m]; r=new float[m-1];//此处的r为追赶法中的u; o=new float[m];//此处o为追赶法中的y M=new float[m];//此处M为追赶法中的x; int jishu=0; for(j;fin>>j;) { if(jishu<=m-1) x[jishu]=j; if(jishu>m-1&&jishu;<2*m) { y[jishu-m]=j; } if(jishu==2*m) { y0=j; } if(jishu==2*m+1) { y3=j; } jishu++; } fin.close(); } void scyt::qiudao() { for(int i=0;i<m-1;i++) { h[i]=x[i+1]-x[i]; } for(i=0;i<m-2;i++) { u[i]=h[i] / (h[i] + h[i+1]); } for(i=0;i<m-2;i++) { q[i]=1-u[i]; } d[0]=6/h[0]*((y[1]-y[0])/h[0]-y0); for(i=1;i<m-1;i++) { d[i]=6/(h[i-1]+h[i])*((y[i+1]-y[i])/h[i]-((y[i]-y[i-1])/h[i-1])); } d[m-1]=6/h[m-2]*(y3-(y[m-1]-y[m-2])/h[m-2]); } void scyt::zgf() { u[m-2]=1; for(int i=0;i<m;i++) { b[i]=2; } c[0]=1; for(i=1;i<m-1;i++) { c[i]=q[i-1]; } //........................................ l[0]=b[0]; for(i=0;i<m-1;i++) { r[i]=c[i] / l[i]; l[i+1]=b[i+1] - (u[i] * r[i]); } o[0]=d[0] / l[0]; for(i=1;i<m;i++) { o[i]=(d[i]-u[i-1]*o[i-1]) / l[i]; } M[m-1]=o[m-1]; for(i=m-2;i>=0;i--) { M[i]=o[i]-r[i] * M[i+1]; } cout<<m<<"个点的导数值分别是:"<<endl; for(i=0;i<m;i++) { cout<<"M"<<i+1<<"="; cout<<M[i]<<endl; } //M的值求出。。。。。。追赶法调用完毕 } void scyt::qiujie() { float S; for(;;) { float f; cout<<"请输入待求x的值(输入1000)时退出:"; cin>>f; if(f==1000) break; for(int i=0;i<m;i++) { if(f>x[i]&&f<x[i+1]) { S=pow((x[i+1]-f),3)*M[i]/(6*h[i]) + pow(f-x[i],3)*M[i+1]/(6*h[i]) + (x[i+1]-f)*(y[i]-h[i]*h[i]*M[i]/6)/h[i] + (f-x[i])*(y[i+1]-h[i]*h[i]*M[i+1]/6)/h[i]; cout<<"S["<<f<<"]="<<S<<endl; } } } } scyt::~scyt() { delete []x,y,d,h,u,q,a,b,c,l,r,o,M; }

    5
    372
    2KB
    2012-06-12
    47
  • c++多项式拟合

    #ifndef FUNCTION_H_ #define FUNCTION_H_ #include <iostream> #include <cmath> #include "polyfit.h" #include <fstream> using namespace std; dxs::dxs() { ifstream fin("多项式拟合.txt"); fin>>n; x=new float[n]; y=new float[n]; for(int i=0;i<n;i++) { fin>>x[i]; } for(i=0;i<n;i++) { fin>>y[i]; } cout<<"输入拟合多项式的次数:"; int nn; cin>>nn; m=nn+1; u=new float*[m]; for(i=0;i<m;i++) { u[i]=new float[m+1]; }//创建m行,m+1列数组 } void dxs::dfine() { for(int i=0;i<m;i++) { for(int j=0;j<m+1;j++) { u[i][j]=0; } } for(i=0;i<m;i++) { for(int j=0;j<m;j++) { for(int k=0;k<n;k++) { u[i][j]=u[i][j]+pow(x[k],j+i); } } } for(i=0;i<m;i++) { for(int k=0;k<n;k++) { u[i][m]=u[i][m]+pow(x[k],i)*y[k]; } } } void dxs::show() { for(int i=0;i<m;i++) { for(int j=0;j<m+1;j++) { cout<<u[i][j]<<" ";//<<endl; } cout<<endl; } ////显示具有m行m+1列u数组的各元素值 } void dxs::select_main(int k,float **p,int m) { double d; d=*(*(p+k)+k); //cout<<d; int l=k; int i=k+1; for(;i<m;i++) { if(fabs(*(*(p+i)+k)) > fabs(d)) { d=*(*(p+i)+k); l=i; } else continue; } if(d==0) cout<<"错误"; else { if(k!=l) { for(int j=k;j<m+1;j++) { double t; t=*(*(p+l)+j); *(*(p+l)+j)=*(*(p+k)+j); *(*(p+k)+j)=t; } } } } void dxs::gaosi() { for(int k=0;k<m;k++) { select_main(k,u,m);//调用列主元函数 for(int i=1+k;i<m;i++) { // *(*(p+i)+k)=(float) *(*(p+i)+k) / *(*(p+k)+k); u[i][k]=(float) u[i][k] / u[k][k]; } for(i=k+1;i<m;i++) { for(int j=k+1;j<m+1;j++) { u[i][j]=u[i][j] - u[i][k] * u[k][j]; } u[i][k]=0; } } } void dxs::answer() { u[m-1][m]=u[m-1][m] / u[m-1][m-1]; for(int i=m-2;i>=0;i--) { float a=0; for(int j=i+1;j<m;j++) { //a=a + (*(*(p+i)+j) * *(*(p+j)+m)); a=a+u[i][j] * u[j][m]; } //*(*(p+i)+n-1)= (*(*(p+i)+n-1) - a) / *(*(p+i)+i); u[i][m]= (u[i][m] -a) / u[i][i]; } cout<<"方程组的解为:"<<endl; for(i=0;i<m;i++) { cout<<"a"<<i+1<<"="; cout<<u[i][m]<<endl; // l[i]=*(*(p+i)+n-1); } cout<<"y="&lt;&lt;u[0][m]; for(i=1;i&lt;m;i++) { cout&lt;&lt;showpos&lt;&lt;u[i][m]&lt;&lt;"x"; if(i!=1)cout<<"^"<<noshowpos<<i; } cout<<endl; } dxs::~dxs() { delete[]x,y; delete []*u; } #endif

    4
    1271
    2KB
    2012-06-12
    50
  • c++高斯消元法设计

    #include <iostream> #include <fstream> #include <string> #include <cmath> using namespace std; //申明外联函数 //void gauss(); void select_main(int k,float **p,int m); void show(int m,int n,float **p); void answer(int m,int n,float **p); int gain_m(); int gain_n(int m); void guass(int m,int n,float **p); //********************************************* //主函数体 void main() { int m=gain_m(); int n=gain_n(m); cout<<endl<<"行数为:"<<m<<endl; cout<<"列数为:"<<n<<endl; //定义m行n列的动态数组 float **p=new float*[m]; for(int i=0;i<m;i++) { p[i]=new float[m]; } ifstream oin("p59.txt"); float fn[100]; int jishu=0; for(float a;oin>>a;) { fn[jishu]=a; jishu++; } for(i=0;i<m;i++) { for(int j=0;j<n;j++) { *(*(p+i)+j)=fn[i*n+j]; } } //show(m,n,p); guass(m,n,p); cout<<endl; cout<<"高斯消元后的到的行列式为:"<<endl; show(m,n,p); answer(m,n,p); } //列主元函数 void select_main(int k,float **p,int m) { double d; d=*(*(p+k)+k); //cout<<d; int l=k; int i=k+1; for(;i<m;i++) { if(fabs(*(*(p+i)+k)) > fabs(d)) { d=*(*(p+i)+k); l=i; } else continue; } if(d==0) cout<<"错误"; else { if(k!=l) { for(int j=k;j<m+1;j++) { double t; t=*(*(p+l)+j); *(*(p+l)+j)=*(*(p+k)+j); *(*(p+k)+j)=t; } } } } //显示具有m行n列p数组的各元素值 void show(int m,int n,float **p) { for(int i=0;i<m;i++) { for(int j=0;j<n;j++) {cout<<*(*(p+i)+j)<<" ";} cout<<endl;}//数组创建成功 cout<<endl; } //计算并输出x的解 void answer(int m,int n,float **p) { *(*(p+m-1)+n-1)=*(*(p+m-1)+n-1) / *(*(p+m-1)+n-2); //cout<<*(*(p+m-1)+n-1)<<endl; for(int i=m-2;i>=0;i--) { float a=0; for(int j=i+1;j<m;j++) { a=a + (*(*(p+i)+j) * *(*(p+j)+m)); } // cout<<a<<endl; *(*(p+i)+n-1)= (*(*(p+i)+n-1) - a) / *(*(p+i)+i); } cout<<"方程组的解为:"<<endl; for(i=0;i<m;i++) { cout<<"x"<<i+1<<"="; cout<<*(*(p+i)+n-1)<<endl; } } //获得行列式的行数 int gain_m() { ifstream fin("p59.txt"); int f=0; for(string str;getline(fin,str);) { cout<<str<<endl; f++; } return f; } //获得行列式的列数,参数m为行列式的行数 int gain_n(int m) { ifstream oin("p59.txt"); int element=0; for(float a;oin>>a;) { element++; } return element/m; } void guass(int m,int n,float **p) { for(int k=0;k<m;k++) { select_main(k,p,m);//调用列主元函数 for(int i=1+k;i<m;i++) { *(*(p+i)+k)=(float) *(*(p+i)+k) / *(*(p+k)+k); } for(i=k+1;i<m;i++) { for(int j=k+1;j<n;j++) { *(*(p+i)+j)=(*(*(p+i)+j)) - (*(*(p+i)+k)) * (*(*(p+k)+j)); } *(*(p+i)+k)=0; } } }

    0
    168
    3KB
    2012-06-12
    11
  • 银行家算法

    数值计算中的银行家算法C++实现方法 #include <iostream> using namespace std; #define MAXPROCESS 50 //最大进程数 #define MAXRESOURCE 100 //最大资源数 int AVAILABLE[MAXRESOURCE]; //可用资源数组 int MAX[MAXPROCESS][MAXRESOURCE]; //最大需求矩阵 int ALLOCATION[MAXPROCESS][MAXRESOURCE];//分配矩阵 int NEED[MAXPROCESS][MAXRESOURCE]; //需求矩阵 int REQUEST[MAXPROCESS][MAXRESOURCE]; //进程需要资源数 bool FINISH[MAXPROCESS]; //系统是否有足够的资源分配 int p[MAXPROCESS]; //记录序列 int m,n; //m个进程,n个资源 void Init(); //初始化 bool Safe(); //安全性检查 void Bank(); //银行家算法 void main() { cout<<"sd"; Init(); //Safe(); //Bank(); } void Init() //初始化 { int i,j; cout<<"银行家算法"<<endl; cout<<"请输入进程的数目:\n"; cin>>m; cout<<"请输入资源的种类:\n"; cin>>n; cout<<"请输入每个进程最多所需的各资源数,按照"<<m<<"x"<<"n"<<"矩阵输入"<<endl; for(i=0;i<m;i++) for(j=0;j<n;j++) cin>>MAX[i][j]; cout<<"请输入每个进程已分配的各资源数,也按照"<<m<<"x"<<n<<"矩阵输入"<<endl; for(i=0;i<m;i++) { for(j=0;j<n;j++) { cin>>ALLOCATION[i][j]; NEED[i][j]=MAX[i][j]-ALLOCATION[i][j]; if(NEED[i][j]<0) { cout<<"您输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源数错误,请重新输入:"<<endl; j--; continue; } } } cout<<"请输入各个资源现有的数目:"<<endl; for(i=0;i<n;i++) { cin>>AVAILABLE[i]; } } void Bank() //银行家算法 { int i,cusneed; char again; int breakmark=0; while(1) { breakmark=0; cout<<"请输入要申请资源的进程号"<<endl; cin>>cusneed; cout<<"请输入进程所请求的各资源的数量"<<endl; for(i=0;i<n;i++) cin>>REQUEST[cusneed][i]; for(i=0;i<n;i++) { if(REQUEST[cusneed][i]>NEED[cusneed][i]) { cout<<"您输入的请求数超过进程的需求量!请重新输入!"<<endl; breakmark=1; break;//continue; } if(REQUEST[cusneed][i]>AVAILABLE[i]) { cout<<"您输入的请求数超过系统拥有的资源数!请重新输入!"<<endl; breakmark=1; break;//continue; } if(breakmark ==1) continue; for(i=0;i<n;i++) { AVAILABLE[i]-=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; NEED[cusneed][i]-=REQUEST[cusneed][i]; } if(Safe()) cout<<""<<endl; } } }

    4
    72
    2KB
    2012-06-12
    10
  • 2011年3月计算机等级考试二级C++真题-注解3.pdf

    2011年3月计算机等级考试二级C++真题-注解3.pdf

    5
    103
    1.05MB
    2012-06-12
    10
  • MASM6.11(xp安装版)

    masm是汇编语言专用的汇编工具,安装后的各种汇编命令可以帮你轻松实现dos系统下的程序开发

    3
    238
    3.12MB
    2011-12-21
    10
关注 私信
上传资源赚积分or赚钱