数值分析 算法C语言程序

更新时间:2023-07-23 12:24:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数值分析 各个算法的C语言程序

一、 拉格朗日插值

#include<stdio.h> #include<stdlib.h> #include<math.h> void Lagrange(float s) {

double x[5]={0.2,0.4,0.6,0.8,1.0},y[5]={0.98,0.92,0.81,0.64,0.38},f,L=0; int i,j; for (i=0;i<5;i++) { f=1; for (j=0;j<5;j++) if(j!=i) f=(s-x[j])/(x[i]-x[j])*f; L+=f*y[i]; } printf("输出:%f\n",L); }

void main() { float x; printf("输入插值点:"); scanf("%f",&x); Lagrange(x);

}

二、 牛顿插值

#include<stdlib.h> #include<stdio.h> #include<math.h> int ND(float s) { double x[5]={0.2,0.4,0.6,0.8,1.0},y[5]={0.98,0.92,0.81,0.64,0.38},p=0,g,f; int i,j,k;

for (i=0;i<5;i++) {

for (j=4;j>i;j--) { f=x[j]-x[j-i-1];y[j]=(y[j]-y[j-1])/f;} g=y[i+1];

for (k=0;k<=i;k++) g=g*(s-x[k]); p=p+g; }

printf("输出插值点函数值:%f\n",p+y[0]); return 1; }

数值分析 各个算法的C语言程序

void main() { float x; printf("输入插值点:"); scanf("%f",&x); ND(x);

}

三、 埃尔米特插值

#include<stdio.h> #include<stdlib.h> #include<math.h> void Hermite(float s) { double x[3]={0.25,1,2.25},y[3]={0.125,1,3.375},z[3]={0.75,1.5,2.25}; double H=0.0,a,b,f,g; int i,j; for (i=0;i<3;i++) { f=1.0;g=0.0;

for (j=0;j<3&&j!=i;j++) {f=f*(s-x[j])/(x[i]-x[j]);g=g+1/(x[i]-x[j]);} a=(1-2*(s-x[i])*g)*f*f;b=(s-x[i])*f*f; H=H+y[i]*a+z[i]*b; }

printf("%f\n",H); }

void main() { float x; printf("输入插值点:"); scanf("%f",&x); Hermite(x);

}

四、 三次样条插值

#include <math.h> #include <stdio.h> #include <stdlib.h>

数值分析 各个算法的C语言程序

void main() {

int N=7,R=2,i,k; double p1,p2,p3,p4;

double x[8]={0.5,0.7,0.9,1.1,1.3,1.5,1.7,1.9};

double y[8]={0.4794,0.6442,0.7833,0.8912,0.9636,0.9975,0.9917,0.9463}; double P0=-0.4794,Pn=-0.9463,u[3]={0.6,0.8,1.2},s[3]; double h[7],a[8],c[7], g[8],af[8],ba[7],m[8]; for(k=0;k <N;k++) h[k]=x[k+1]-x[k];

for(k=1;k <N;k++) a[k]=h[k]/(h[k]+h[k-1]); for(k=1;k <N;k++) c[k]=1-a[k];

for(k=1;k <N;k++) g[k]=3*(c[k]*(y[k+1]-y[k])/h[k]+a[k]*(y[k]-y[k-1])/h[k-1]); c[0]=a[N]=1;

g[0]=3*(y[1]-y[0])/h[0]-P0*h[0]/2;

g[N]=3*(y[N]-y[N-1])/h[N-1]+Pn*h[N-1]/2; ba[0]=c[0]/2; g[0]=g[0]/2; for(i=1;i <N;i++)

{ af[i]=2-a[i]*ba[i-1]; g[i]=(g[i]-a[i]*g[i-1])/af[i]; ba[i]=c[i]/af[i]; } af[N]=2-a[N]*ba[N-1];

g[N]=(g[N]-a[N]*g[N-1])/af[N]; m[N]=g[N];

for(i=N-1;i>=0;i--) m[i]=g[i]-ba[i]*m[i+1]; for(i=0;i <=R;i++) { k=0;

while(u[i]> x[k+1])

k++;

p1=(h[k]+2*(u[i]-x[k])*pow((u[i]-x[k+1]),2)*y[k])/pow(h[k],3); p2=(h[k]-2*(u[i]-x[k+1])*pow((u[i]-x[k]),2)*y[k+1])/pow(h[k],3); p3=(u[i]-x[k])*pow((u[i]-x[k+1]),2)*m[k]/pow(h[k],2); p4=(u[i]-x[k+1])*pow((u[i]-x[k]),2)*m[k+1]/pow(h[k],2); s[i]=p1+p2+p3+p4; }

printf( "\nx= "); for(i=0;i <=N;i++) printf( "%8.1f ",x[i]); printf( "\ny= "); for(i=0;i <=N;i++) printf( "%8.4f ",y[i]); printf( "\n\nu= "); for(i=0;i <=R;i++) printf( "%9.2f ",u[i]);

printf( "\n插值点:s= "); for(i=0;i <=R;i++)

数值分析 各个算法的C语言程序

printf( "%9.5f ",s[i]); printf("\n");

}

五、 复合梯形公式

#include<stdio.h> #include<stdlib.h> #include<math.h>

double FTX(int n,float a,float b) { double f=0,t,h,*x,*y; int i; x=(double*)malloc((n+1)*sizeof(double)); y=(double*)malloc((n+1)*sizeof(double)); h=(b-a)/n;

for(i=0;i<n+1;i++) {x[i]=a+i*h;y[i]=sin(x[i]);} for(i=1;i<n;i++) f=f+2*y[i]; t=h/2*(y[0]+f+y[n]); printf("输出函数值:%f\n",t); return 1; }

void main() { float a,b; int n;

printf("输入区间上,下限:"); scanf("%f %f",&a,&b); printf("输入等分区间数:"); scanf("%d",&n); FTX(n,a,b);

}

六、 复合辛普森求积公式

数值分析 各个算法的C语言程序

#include<stdio.h> #include<stdlib.h> #include<math.h>

double FSP(int n,float a,float b) { double f1=0,f2=0,h,*x1,*y1,*x2,*y2; int i; x1=(double*)malloc((n+1)*sizeof(double)); y1=(double*)malloc((n+1)*sizeof(double)); x2=(double*)malloc(n*sizeof(double)); y2=(double*)malloc(n*sizeof(double)); h=(b-a)/n;

for(i=0;i<n+1;i++) {x1[i]=a+h*i;y1[i]=sin(x1[i])*x1[i];} for(i=0;i<n;i++) {x2[i]=x1[i]+h/2;y2[i]=sin(x2[i])*x2[i];} for(i=1;i<n;i++) f1=f1+2*y1[i]; for(i=0;i<n;i++) f2=f2+4*y2[i];

printf("输出函数值:%f\n",h/6*(y1[0]+f1+f2+y1[n])); return 1; }

void main() { float a,b; int n; printf("输入区间上,下限:"); scanf("%f %f",&a,&b); printf("输入等分区间数:"); scanf("%d",&n); FSP(n,a,b);

}

七、 直接三角分解法

#include<stdio.h> #include<stdlib.h> #include<math.h> void main() {double

A[3][3]={0.25,0.2,0.166667,0.3333,0.25,0.2,0.5,1,2},x[3],y[3],b[3]={9,8,8},L[3][3],U[3][3],f1=0,

数值分析 各个算法的C语言程序

f2=0; int i,j,k;

for(i=0;i<3;i++) for(j=0;j<3;j++)

{U[i][j]=0;L[i][j]=0;} for(i=0;i<3;i++)

{U[0][i]=A[0][i];L[i][0]=A[i][0]/U[0][0];L[i][i]=1;} for(i=1;i<3;i++) for(j=i;j<3;j++)

{for(k=0;k<=i-1;k++){f1=f1+L[i][k]*U[k][j];f2+=L[j][k]*U[k][i];} U[i][j]=A[i][j]-f1;L[j][i]=(A[j][i]-f2)/U[i][i];f1=0;f2=0;} y[0]=b[0];

for(i=1;i<3;i++)

{for(j=0;j<=i-1;j++) f1+=L[i][j]*y[j];y[i]=b[i]-f1;f1=0;} x[2]=y[2]/U[2][2]; for(i=1;i>=0;i--)

{for(j=i+1;j<3;j++) f2+=U[i][j]*x[j];x[i]=(y[i]-f2)/U[i][i];f2=0;} printf("输出L矩阵:\n"); for(i=0;i<3;i++)

{for(j=0;j<3;j++)

printf("%f ",L[i][j]); printf("\n");}

printf("输出U矩阵:\n"); for(i=0;i<3;i++)

{for(j=0;j<3;j++)

printf("%f ",U[i][j]); printf("\n");}

printf("输出求解结果:\n"); for(i=0;i<3;i++)

printf("%f ",x[i]); printf("\n");

}

八、 改进的平方法

#include<stdio.h>

数值分析 各个算法的C语言程序

#include<stdlib.h> #include<math.h> void main() {

double A[3][3]={2,-1,1,-1,-2,3,1,3,1},x[3],y[3],b[3]={4,5,6},d[3],L[3][3],U[3][3],f1=0,f2=0; int i,j,k,n=3; for(i=0;i<n;i++)

for(j=0;j<n;j++) {U[i][j]=0;L[i][j]=0;} d[0]=A[0][0];L[0][0]=1; for(i=1;i<n;i++) {

L[i][i]=1;

for(j=0;j<=i-1;j++) {for(k=0;k<=j-1;k++) f1+=U[i][k]*L[j][k];

U[i][j]=A[i][j]-f1;L[i][j]=U[i][j]/d[j];f2+=U[i][j]*L[i][j];f1=0;} d[i]=A[i][j]-f2;f2=0;} y[0]=b[0];

for(i=1;i<n;i++) {for(j=0;j<=i-1;j++) f1+=L[i][j]*y[j];y[i]=b[i]-f1;f1=0;} x[n-1]=y[n-1]/d[n-1];

for(i=n-2;i>=0;i--) {for(j=i+1;j<n;j++) f2+=L[j][i]*x[j];x[i]=y[i]/d[i]-f2;f2=0;} printf("输出L矩阵:\n"); for(i=0;i<n;i++)

{for(j=0;j<n;j++) printf("%f ",L[i][j]); printf("\n");} printf("输出U矩阵:\n"); for(i=0;i<n;i++)

{for(j=0;j<n;j++) printf("%f ",U[i][j]); printf("\n");} printf("输出求解结果:\n");

for(i=0;i<n;i++) printf("%f ",x[i]); printf("\n");

}

九、 追赶法

#include<stdio.h> #include<stdlib.h> #include<math.h> void main()

数值分析 各个算法的C语言程序

{

double A[5][5]={2,-1,0,0,0,-1,2,-1,0,0,0,-1,2,-1,0,0,0,-1,2,-1,0,0,0,-1,2},f[5]={1,0,0,0,0}; double x[5],y[5],U[5][5]; int i,j,n=5;

for(i=0;i<n;i++)

for(j=0;j<n;j++) U[i][j]=0; U[0][0]=U[n-1][n-1]=1; U[0][1]=A[0][1]/A[0][0]; for(i=1;i<n-1;i++)

{ U[i][i]=1;U[i][i+1]=A[i][i+1]/(A[i][i]-A[i][i-1]*U[i-1][i]);} y[0]=f[0]/A[0][0]; for(i=1;i<n;i++)

y[i]=(f[i]-A[i][i-1]*y[i-1])/(A[i][i]-A[i][i-1]*U[i-1][i]); x[n-1]=y[n-1];

for(i=n-2;i>=0;i--) x[i]=y[i]-U[i][i+1]*x[i+1]; printf("输出U矩阵:\n"); for(i=0;i<n;i++)

{ for(j=0;j<n;j++) printf("%f ",U[i][j]); printf("\n");} printf("输出求解结果:\n");

for(i=0;i<n;i++) printf("%f ",x[i]); printf("\n");

}

十、 雅可比迭代法

#include<stdio.h> #include<stdlib.h> #include<math.h> void main() {

double A[3][3]={5,2,1,-1,4,2,2,-3,10},x[50][3],b[3]={-12,20,3},f=0,L=1; int n=3,i,j,k=1;

for (i=0;i<3;i++) x[0][i]=0;/*初始值*/ while(L<0.003)

{

for(i=0;i<n;i++)

{ for(j=0;j<n;j++)

数值分析 各个算法的C语言程序

if(j!=i) f=f+A[i][j]*x[k-1][j]; x[k][i]=(b[i]-f)/A[i][i];} L=x[k][0]-x[k-1][0]; for(i=1;i<n;i++)

if((x[k][i]-x[k-1][i])/(x[k][i-1]-x[k-1][i-1])>1||(x[k][i]-x[k-1][i])/(x[k][i-1]-x[k-1][i-1])<-1) L=x[k][i]-x[k-1][i]; k++; }

printf("输出每次迭代求得的X值:\n"); for(i=1;i<k;i++) { printf("第%d次迭代:",i); for(j=0;j<n;j++)

printf("%f ",x[i][j]); printf("\n"); }

printf("\n输出迭代次数:%d\n",k-1);

}

十一、 高斯—塞德尔迭代法

#include<stdio.h> #include<stdlib.h> #include<math.h> void main() {

数值分析 各个算法的C语言程序

double A[3][3]={5,2,1,-1,4,2,2,-3,10},x[50][3],b[3]={-12,20,3},f1=0,f2=0,L=1; int i,j,k=1,n=3;

for (i=0;i<3;i++) x[0][i]=0; while(L>0.00001||L<-0.00001) {

for(i=0;i<n;i++)

{ for(j=0;j<n;j++)

{if(j<i) f1+=A[i][j]*x[k][j];

else if(j>i) f2+=A[i][j]*x[k-1][j];} x[k][i]=(b[i]-f1-f2)/A[i][i];}

L=x[k][0]-x[k-1][0];

for(i=1;i<n;i++)

if((x[k][i]-x[k-1][i])/(x[k][i-1]-x[k-1][i-1])>1||(x[k][i]-x[k-1][i])/(x[k][i-1]-x[k-1][i-1])<-1) L=x[k][i]-x[k-1][i]; k++;

}

printf("输出迭代X矩阵:\n"); for(i=1;i<k;i++)

{for(j=0;j<n;j++) printf("%f ",x[i][j]); printf("\n");} printf("\n输出迭代次数:%d\n",k-1);

}

十二、 超松弛迭代法

#include<stdio.h> #include<stdlib.h> #include<math.h> void main() {

数值分析 各个算法的C语言程序

double A[3][3]={5,2,1,-1,4,2,2,-3,10},x[30][3],b[3]={-12,20,3},f1=0,f2=0,L=1,w=0.9; int i,j,k=1,n=3;

for(i=0;i<3;i++) x[0][i]=0; while(L>0.0001||L<-0.0001)

{

for(i=0;i<n;i++)

{ for(j=0;j<n;j++)

{if(j<i) f1+=A[i][j]*x[k][j];

else if(j>i) f2+=A[i][j]*x[k-1][j];} x[k][i]=w*(b[i]-f1-f2)/A[i][i];} L=x[k][0]-x[k-1][0]; for(i=1;i<n;i++)

if((x[k][i]-x[k-1][i])/(x[k][i-1]-x[k-1][i-1])>1||(x[k][i]-x[k-1][i])/(x[k][i-1]-x[k-1][i-1])<-1) L=x[k][i]-x[k-1][i]; k++;

}

printf("输出迭代X矩阵:\n"); for(i=1;i<k;i++)

{for(j=0;j<n;j++) printf("%f ",x[i][j]); printf("\n");}

printf("\n输出迭代次数:%d\n",k-1);

}

数值分析 各个算法的C语言程序

数值分析算法程序

班级:计算08Q2班 姓名:甄彦福

本文来源:https://www.bwwdw.com/article/wysm.html

Top