📄 tenprograms.txt
字号:
数值计算方法程序
一、
利用对分法、迭代法、牛顿法、割线法求方程x*x*x-5*x/2+1=0在区间[0,1]上的根,要精确到三位小数。
1、对分法程序
#include<math.h>
main()
{float a,b ,n,p;
float x;
int i;
float f (float x);
printf("输入区间");
printf("x");
scanf("%f",&a);
printf("精确值");
sanf("%f",&b);
printf("精确值:");
scanf("%f",&p);
n=(log10(b-a)-log10(pow(10,-p)/2))/log10(2);
printf("%f",n) ;
for (i=0;i<n;i++)
{x=(a+b)/2;
if (f(x)==0)
printf("实际是%f",x);
break;}
else if (f(a)*f(b)<0)
b=x;
else a=x;
}
printf("实际是%f",x);
getch();
}
float f(float x)
{float z;
z=power(x,3)+3*pow(x,2)+3*x-2 ;
return(z); }
2、迭代法程序
#include<math.h>
main()
{float x,y,z,q;
Printf(“input x”);
Scanf(“%f”,&x);
do{
y=(2*pow(x,3)+2)/5;
printf(“z=%f”,y);
z=(2*pow(x,3)+2)/ 5;
printf(“x=%f”,x);
x=z-(y-z)*(y-z)/(z-2*y+x);
printf(“x=%f”,x);
printf(“\n”);
q=x-z;
}
while(fabs(q)>0.0005);
getch();
}
3、牛顿迭代法程序
#include<math.h>
main()
{float x,y,e,q;
Printf();
Scanf();
e=x;
do {y=e-(pow(e,3))-2.5*x+1}/(3*pow(e,2)-2.5);
e=y;
q=fabs(x-y);
x=y;
printf(“x=%f”,y);
}
while (q>0.0005);
Printf(“x=%f”,x);
}
4、割线法程序
#include<math.h>
main()
{floatx[10],q,f();
int I;
printf();
scanf();
scanf();
I=1;
do{
x[i+1]=x[i]-(f(x[i])/(f(i)-f(i-1)))*(x[i]-x[i-1]);
printf(“x=%f”,x[i]);
q=fabs(x[i+1]-x[i]);
printf();
i=i+1;
}
while (q>0.005);
printf(“x=%f”,x[i]);
getch();}
float f(float i)
{
float z;
z=pow(I,3)-2.5*i+1;
return(z);
}
二、其他六个程序
5、高斯消元法
#include <math.h>
#include <stdio.h>
#define n 3
#define eps 1e-3
main()
{int i,j,k,r;
double c,a[n][n+1]={{2,2,3,3},{4,7,7,1},{-2,4,5,-7}};
double static x[n];
for(k=0;k<n-1;k++)
{r=k;
for(i=k;i<n;i++)
if(fabs(a[i][k])>fabs(a[r][k]))r=i;
if(fabs(a[r][k])<eps)
{printf("\n there is a wrong!");
exit(0);}
if(r>k)
{for(j=k;j<n+1;j++)
{c=a[k][j];a[k][j]=a[r][j];a[r][j]=c;}
}
for(i=k+1;i<n;i++)
{a[i][k]=a[i][k]/a[k][k];
for(j=k+1;j<n+1;j++)
a[i][j]=a[i][j]-a[i][k]*a[k][j];
}
}
a[n-1][n]=a[n-1][n]/a[n-1][n-1];
for(k=n-2;k>=0;k--)
{c=0;
for(j=k+1;j<n;j++)
c=c+a[k][j]*a[j][n];
a[k][n]=(a[k][n]-c)/a[k][k];
}
for(k=0;k<n;k++)
printf("\nx[%d]=%12.8f \n",k,a[k][n]);
}
6、 雅克比迭代法程序
#include<math.h>
#include<stdio.h>
#define n 3
#define nmax 7
static double a[n][n]={{10,-1,-2},{-1,10,-2},{-1,-1,5}};
static double b[n]={7.2,8.3,4.2};
main()
{ int i,j,k;
double sum,norm,d,s,x[n],y[n];
for(i=0;i<n;i++) x[i]=0;
k=0;
printf("\nk=%2dx=",k);
for(i=0;i<n;i++) printf("%12.8f",x[i]);
do
{k++;
if(k>nmax){printf("\n the iteration failed!");break;}
{ for(i=0;i<n;i++)
{sum=0.0;
for(j=0;j<n;j++)
if (j!=i) sum=sum+a[i][j]*x[j];
y[i]=(b[i]-sum)/a[i][i];
}
for(i=0;i<n;i++)
x[i]=y[i];
printf("\nk=%2d x=",k);}
for(i=0;i<n;i++) printf("%f",x[i]);
}while (x[i]>=0.1e-6);
}
7、 高斯---塞德尔迭代法程序
#include<math.h>
#include<stdio.h>
#define n 3
#define nmax 100
static double a[n][n]={{10,-1,-2},{-1,10,-2},{-1,-1,5}};
static double b[n]={7.2,8.3,4.2};
main()
{ int i,j,k;
double sum,norm,d,s,x[n];
for(i=0;i<n;i++) x[i]=0;
k=0;
printf("\nk=%2dx=",k);
for(i=0;i<n;i++) printf("%12.8f",x[i]);
do
{k++;
if(k>nmax){printf("\n the iteration failed!");break;}
norm=0.0;
for(i=0;i<n;i++)
{s=x[i];
sum=0.0;
for(j=0;j<n;j++)
if (j!=i) sum=sum+a[i][j]*x[j];
x[i]=(b[i]-sum)/a[i][i];
d=fabs(x[i]-s);
if (norm<d)norm=d;
}
printf("\nk=%2d x=",k);
for(i=0;i<n;i++) printf("%f",x[i]);
}while (norm>=0.1e-6);
if(norm<0.1e-6)
{printf("\n\n the result is:\n");
printf("\nk=%d",k);
for (i=0;i<n;i++)
printf("x[%d]=%12.8f",i,x[i]);
}
}
8、幂法
#include<stdio.h>
#include<math.h>
#define n 3
#define nmax 100
#define epsilon 0.001
static double a[n][n]={{2,3,2},{10,3,4},{3,6,1}};
static double x[n]={0,0,1};
static double y[n];
main()
{int i,j,k;
double xmax,oxmax;
oxmax=0;
for(k=0;k<nmax;k++)
{for(j=0;j<n;j++)
{y[j]=0;
for(i=0;i<n;i++)
y[j]+=a[j][i]*x[i];
}
xmax=0;
for(j=0;j<n;j++)
if(fabs(y[j])>xmax) xmax=fabs(y[j]);
for(j=0;j<n;j++)
y[j]/=xmax;
for(j=0;j<n;j++)
x[j]=y[j];
if(fabs(xmax-oxmax)<epsilon)
{printf("最大特征根为:%f\n",xmax);
printf("特征向量为:\n");
for(k=0;k<n;k++) printf("%f\n",y[k]);
break;
}
oxmax=xmax;
}
}
9、线性拟合态
#include "stdio.h"
#define M 25
typedef struct pi
{ float x;
float y;
}p
main()
{int m,i;
p point[M];
float u11,u12,u21,u22,c1,c2;
float a,b,t;
printf("\ninput m value");
scanf("%d",&m);
printf("input the(x,y),i=1,2....%d\n",m);
for(i=0;i<m;i++){
scanf("%f",&t);
point[i].x=t;
scanf("%f",t);
point[i].y=t;
}
}
for(i=1;i<=m;i++){
u21=u21+point[i].x;
u22=u22+poiny[i].point[i];
c1=c1+point[i].y;
c2=c2+poiny[i].x*point[i].y;
}
u12=u21;
u11=m;
a=(cl*u22-c2*u12)/(u11*u22-u12*u21);
b=(cl*u21-c2*u11)/(u21*u12-u22*u11);
printf("p=%f+%fx\n",a,b);
return 0;
}
10、拉格朗日插值程序。
#include "stdio.h"
static double x[5]={1.615,1.634,1.702,1.828,1.921};
static double y[5]={2.41450,2.46459,2.65271,3.03035,3.34066};
main()
{int n,i,j;
float x1,y1,t;
printf("input numbers x1 n=\n");
scanf("%f%d",&x1,&n);
y1=0;
for(i=0;i<n;i++)
{t=1.0;
for(j=0;j<n;j++)
if(i!=j) t=t*(x1-x[j])/(x[i]-x[j]);
y1=y1+t*y[i];}
printf("y1=%f\n",y1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -