- 博客(0)
- 资源 (9)
- 收藏
- 关注
c++追赶法代码
#include
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<>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<>b[i];
}
for(i=0;i<m-1;i++)
{
cout<<"输入a["<<i<>a[i];
}
for(i=0;i<m-1;i++)
{
cout<<"输入c["<<i<>c[i];
}
for(i=0;i<m;i++)
{
cout<<"输入d["<<i<>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=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;
}
2012-06-12
三次样条插值
#include
#include
#include
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>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=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;
if(X!=1000)
{for(i=0;i<n-1;i++)
{if(xx[i]=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;
}
}
}
2012-06-12
三次样条插值代码
#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;
}
2012-06-12
c++多项式拟合
#ifndef FUNCTION_H_
#define FUNCTION_H_
#include
#include
#include "polyfit.h"
#include
using namespace std;
dxs::dxs()
{
ifstream fin("多项式拟合.txt");
fin>>n;
x=new float[n];
y=new float[n];
for(int i=0;i>x[i];
}
for(i=0;i>y[i];
}
cout<>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 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=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="<<u[0][m];
for(i=1;i<m;i++)
{
cout<<showpos<<u[i][m]<<"x";
if(i!=1)cout<<"^"<<noshowpos<<i;
}
cout<<endl;
}
dxs::~dxs()
{
delete[]x,y;
delete []*u;
}
#endif
2012-06-12
c++高斯消元法设计
#include
#include
#include
#include
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>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 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)<=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<>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;
}
}
}
2012-06-12
银行家算法
数值计算中的银行家算法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;
}
}
}
2012-06-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人