来自「一个用C++编写的积分算法,可以用VC编译.」· 代码 · 共 444 行
TXT
444 行
#include "stdlib.h"
#include "math.h"
#include "iostream.h"
#include "stdio.h"
#include "积分.h"
double gauss::derivate (double A[max],double B[max],double x,int n)
{
int j;
for (j=0;j<n;j++)
{
if(j==0)
B[j]=A[j];
else
{
B[j]=A[j]+x*B[j-1];
}
}
return B[n-1];
}
gauss::rowgauss (double A[max][max],double B[max],int n)
{
int i,j,k;
double temp;
int row,line[max];
double result[max];
for(i=0;i<n;i++)
line[i]=i;
for(i=0;i<n;i++)
{
row=0;
temp=0;
for(j=0;j<n;j++)
{
if(temp<fabs(A[i][j]))
{
temp=fabs(A[i][j]);
row=j;
}
else
continue;
}
if(temp==0)
exit(0);
else
{
for(k=0;k<n;k++)
{
temp=A[k][row];
A[k][row]=A[k][i];
A[k][i]=temp;
}
k=line[row];
line[row]=line[i];
line[i]=k;
for(j=i+1;j<n;j++)
{
temp=A[j][i]/A[i][i];
for(k=i;k<n;k++)
A[j][k]=A[j][k]-temp*A[i][k];
B[j]=B[j]-temp*B[i];
}
}
}
result[n-1]=B[n-1]/A[n-1][n-1];
for(i=n-2;i>=0;i--)
{
temp=0;
for(j=i+1;j<n;j++)
temp+=A[i][j]*result[j];
result[i]=(B[i]-temp)/A[i][i];
}
for(i=0;i<n;i++)
{
row=line[i];
B[row]=result[i];
}
}
gauss::newton (double A[max],double result[max],int n)
{
double B[max],C[max];
double temp,factor,r;
int i,j;
for(i=0;i<n-1;i++)
{
r=3;
do
{
factor=1;
j=10;
temp=derivate(A,B,r,n-i);
temp=temp/derivate(B,C,r,n-i-1);
do
{
if(j==0)
break;
else
{
result[i]=r-factor*temp;
j--;
factor=factor/2;
}
}
while(fabs(derivate(A,B,result[i],n-i))>fabs(derivate(A,B,r,n-i)));
r=result[i];
}
while (fabs(temp)>1e-5);
derivate(A,B,result[i],n-i);
for(j=0;j<n-i;j++)
{
A[j]=B[j];
}
}
for(i=0;i<n-1;i++)
{
if(fabs(result[i])<1e-3)
result[i]=0;
else
continue;
}
}
gauss::legendre (double A[max],int n)
{
int i,j;
double B[max][max];
B[0][0]=1;
B[1][0]=0;
B[1][1]=1;
for(i=1;i<n;i++)
{
B[i+1][i+1]=(2*i+1)*B[i][i]/(i+1);
B[i+1][i]=(2*i+1)*B[i][i-1]/(i+1);
B[i+1][0]=-i*B[i-1][0]/(i+1);
for(j=1;j<i;j++)
B[i+1][j]=((2*i+1)*B[i][j-1]-i*B[i-1][j])/(i+1);
}
for(i=0;i<n;i++)
{ A[i]=B[n-1][n-1-i];
// cout<<A[i]<<" ";
}
cout<<endl;
}
gauss::qiebixuefu (double A[max],int n)
{
double B[max][max];
int i,j;
B[0][0]=1;
B[1][0]=0;
B[1][1]=1;
for(i=1;i<n;i++)
{
B[i+1][i+1]=2*B[i][i];
B[i+1][i]=2*B[i][i-1];
B[i+1][0]=-B[i-1][0];
for(j=1;j<i;j++)
B[i+1][j]=2*B[i][j-1]-B[i-1][j];
}
for(i=0;i<n;i++)
{ A[i]=B[n-1][n-1-i];
cout<<A[i]<<" ";
}
cout<<endl;
}
double newton::coefficient(int k,int n)
{
int i,j;
double temp,temp1;
double A[max];
double B[max][max];
temp=0;
for(i=0;i<=n;i++)
for(j=0;j<n;j++)
B[i][j]=0;
if(k!=0)
{
for(i=0;i<=n;i++)
B[i][i]=1;
for(i=1;i<=n;i++)
{
if(i<k)
{
for (j=0;j<i;j++)
{
if(j==0)
B[i][0]=-i*B[i-1][0];
else
B[i][j]=B[i-1][j-1]-i*B[i-1][j];
}
}
else if(i>k)
{
for (j=0;j<i;j++)
{
if(j==0)
B[i-1][0]=-i*B[i-2][0];
else
B[i-1][j]=B[i-2][j-1]-i*B[i-2][j];
}
}
}
for(i=0;i<n;i++)
{
A[i]=B[n-1][i];
// cout<<A[i]<<" ";
}
for(i=0;i<n;i++)
{
temp1=1;
for(j=0;j<i+2;j++)
temp1*=n;
temp1=A[i]*temp1/(i+2);
temp+=temp1;
}
}
else
{
B[0][0]=-1;
for(i=0;i<=n;i++)
B[i][i+1]=1;
for(i=1;i<=n;i++)
{
B[i][0]=-(i+1)*B[i-1][0];
for (j=1;j<=i;j++)
B[i][j]=B[i-1][j-1]-(i+1)*B[i-1][j];
}
for(i=0;i<=n;i++)
{
A[i]=B[n-1][i];
// cout<<A[i]<<" ";
}
for(i=0;i<=n;i++)
{
temp1=1;
for(j=0;j<i+1;j++)
temp1*=n;
temp1=A[i]*temp1/(i+1);
temp+=temp1;
}
}
// cout<<temp<<endl;
return temp;
}
double newton::newtoncores (double a,double b,double (*f)(double),int n)
{
double C[max];
int i,j;
double temp1,temp2,temp;
int sign;
for(i=0;i<=n;i++)
{
temp1=temp2=1;
for(j=1;j<=i;j++)
temp1*=j;
for(j=1;j<=n-i;j++)
temp2*=j;
temp=coefficient(i,n);
sign=(n-i)%2;
if(sign)
C[i]=-temp/(temp1*temp2*n);
else
C[i]=temp/(temp1*temp2*n);
}
temp=b-a;
temp1=temp/n;
temp2=0;
for(i=0;i<=n;i++)
temp2=temp2+C[i]*f(a+i*temp1);
temp2=temp2*temp;
return temp2;
}
double newton::newtoncores (double a,double b,double (*f)(double),int m,int n)
{
double C[max];
int i,j;
double temp1,temp2,temp,result,r;
int sign;
for(i=0;i<=n;i++)
{
temp1=temp2=1;
for(j=1;j<=i;j++)
temp1*=j;
for(j=1;j<=n-i;j++)
temp2*=j;
temp=coefficient(i,n);
sign=(n-i)%2;
if(sign)
C[i]=-temp/(temp1*temp2*n);
else
C[i]=temp/(temp1*temp2*n);
}
result=0;
temp=(b-a)/m;
temp1=a;
r=(b-a)/(m*n);
for(i=0;i<m;i++)
{
temp2=0;
for(j=0;j<=n;j++)
temp2+=C[j]*f(temp1+j*r);
temp2=temp2*temp;
temp1=temp1+temp;
result+=temp2;
}
return result;
}
double newton::romberg (double a,double b,double (*f)(double))
{
double temp,r,m;
double limit;
double T[max][max];
int k,i;
k=1;
r=b-a;
T[0][0]=r*(f(a)+f(b))/2;
do
{
m=1;
for(i=1;i<k;i++)
m*=2;
temp=0;
for(i=0;i<m;i++)
temp+=f(a+(i+0.5)*r);
T[k][0]=T[k-1][0]/2+r*temp/2;
temp=4;
for(i=1;i<=k;i++)
{
T[k][i]=(temp*T[k][i-1]-T[k-1][i-1])/(temp-1);
temp*=4;
}
r=r/2;
limit=fabs(T[k][k]-T[k-1][k-1]);
k++;
}
while(limit>1e-3);
return T[k-1][k-1];
}
double gauss::integral(double a,double b,double (*f)(double),int n)
{
double value;
int i,j;
double temp1,temp2;
double A[max];
double result[max];
double B[max];
double C[max][max];
legendre(A,n+1);
newton(A,result,n+1);
temp1=temp2=1;
for(i=0;i<n;i++)
{
temp1*=-1;
temp2*=1;
B[i]=(temp2-temp1)/(i+1);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==0)
C[i][j]=1;
else
C[i][j]=C[i-1][j]*result[j];
}
}
rowgauss(C,B,n);
value=0;
for(i=0;i<n;i++)
{
result[i]=result[i]*(b-a)/2+(a+b)/2;
value+=B[i]*f(result[i]);
}
return value;
}
double f(double x)
{
return(1/x);
}
void main()
{
double a,b;
double result;
double f(double);
int n;
a=1;
b=3;
n=5;
gauss aa;
result=aa.integral (a,b,f,n);
cout<<result<<endl;
/* double f(double);
int m,n;
double a,b;
n=2;
m=4;
a=1;b=3;
double result;
newton aa;
result=aa.romberg(a,b,f);
cout<<result<<endl;*/
/* double A[max];
int n;
n=7;
gauss aa;
aa.qiebixuefu (A,n);
// aa.legendre (A,n);*/
/* int n,i,j;
double temp1,temp2,temp;
double C[max][max];
int sign;
for(n=1;n<5;n++)
{
for(i=0;i<=n;i++)
{
temp1=temp2=1;
for(j=1;j<=i;j++)
temp1*=j;
for(j=1;j<=n-i;j++)
temp2*=j;
temp=coefficient(i,n);
sign=(n-i)%2;
if(sign)
C[n][i]=-temp/(temp1*temp2*n);
else
C[n][i]=temp/(temp1*temp2*n);
}
for(i=0;i<=n;i++)
cout<<C[n][i]<<" ";
cout<<endl;
}*/
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?