第一次:牛顿插值
//n次牛顿插值的算法
#include<stdio.h>
#include<math.h>
void main(void)
{
double f[10][10],resx,resy;
int n,i,j;
double x[10] = {0.40,0.55,0.65,0.80,0.90};;
f[0][0]=0.41075;
f[1][0]=0.57815;
f[2][0]=0.69675;
f[3][0]=0.88811;
f[4][0]=1.02652;
//scanf("%d",&n);
//scanf("%lf",&x[i]);
//scanf("%lf",&f[i][0]);
n=5;
/*Calculate*/
for(j=1; j<=n-1; j++)
{
for(i=j; i<=n-1; i++)
{
f[i][j]=(f[i][j-1]-f[i-1][j-1])/(x[i]-x[i-j]);
}
}
/*Print*/
printf("xi\t");
printf("fxi \t",j);
for(j=1; j<=n-1; j++)
printf("%d阶差商 \t",j);
printf("\n");
for(i=0; i<=n-1; i++)
{
printf("%0.2f\t",x[i]);
for(j=0; j<=i; j++)
{
printf("c[%d][%d]=%.5f ",i,j,f[i][j]);
}
printf("\n");
}
/*Calculate for res*/
resx=0.596;
resy=0.0;
for(i=0;i<n;i++){
double temp=f[i][i];
for(j=0;j<i;j++){
temp*=(resx-x[j]);
}
resy+=temp;
printf("N_[%d](%.3f)=%.5f\n",i,resx,resy);
}
return 0;
}
第二次实验:龙贝格
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define P 0.00000001
#define e 2.71828183
#define MAXReTeat 10
#define a 0
#define b 1
#define b acos(-1)
double f(double x) { //被积函数
//return 4.0/(1+x*x);
return exp(x)*cos(x);
}
double Romberg() {
int m,n,k;
double y[MAXReTeat],h,eT,T,xk,s,q,S;
h=b-a;
y[0]=h*(f(a)+f(b))/2.0;//计算T1 1(h)=1/2(b-a)(f(a)+f(b));
m=1;n=1;
eT=P+1;
printf(" k 2^k T(2^K) S(2^K-1) C(2^K-2) R(2^K-3)\n");
printf("%15d\t%15d\t%15.5f\n",m-1,(int)(pow(2,m-1)+1e-10),y[0]);
while(eT>=P) {
S=0.0;
for(k=0; k<n; k++) {
xk=a+(k+0.5)*h;
S+=f(xk);
}
printf("%15d\t%15d\t",m,(int)(pow(2,m)+1e-10));
T=(y[0]+h*S)/2.0;
printf("%15.5f\t",T);
s=1.0;
for(k=1; k<=min(4,m); k++) {
s=4.0*s;// Pow(4,m)
q=(s*T-y[k-1])/(s-1.0);//[pow(4,m)T`m`(h/2)-T`m`(h)]/[pow(4,m)-1]
y[k-1]=T;
if(k==1)printf("%15.5f\t",q);
if(k==2)printf("%15.5f\t",q);
if(k==3)printf("%15.5f\t",q);
T=q;
if(k==min(4,m))puts("");
}
eT=fabs(q-y[m-1]);
y[m]=q;
m=m+1;
n*=2;
h=h/2.0;
}
return q;
}
int main() {
double result = Romberg();
printf("龙贝格算法计算结果:%.7f",result);
return 0;
}
高斯列主元消元法
c++