1 多项式ax2+bx+c求解
/*
date:2004-12-19 16:04
e.g: x2+x+1
input: 1 1 1
output:
two conjugated complex number roots:
x1=-0.50+ 0.87i
x2=-0.50- 0.87i
arithmetic:迭代求解
*/
#include <stdio.h>
#include <math.h>
/*为使用开方函数sqrt( )包含数学函数库*/
int main()
{
float a,b,c,d,e,f,x1,x2;
printf("input equation’s 3 quotieties :");
scanf("%f%f%f",&a,&b,&c);
if (fabs(a)<1e-4) /*注意实数的精确比较方法*/
if (fabs(b)<1e-4)
printf(" equation is invalid");
else
printf("sigle root: x=%5.2f",-c/b);
else
{
d=-b/(2*a);
e=b*b-4*a*c;
if (e>0)
{
x1=d+sqrt(e)/(2*a);
x2=d-sqrt(e)/(2*a);
printf("two unequal real roots:/n x1=%5.2f/n x2=%5.2f/n",x1,x2);
}
else if (fabs(e)<1e-4)
printf("two equal roots : x=%5.2f/n",d);
else
{
f=sqrt(-e)/(2*a);
printf("two conjugated complex number roots:/n");
printf("x1=%5.2f+%5.2fi/n",d,f);
printf("x2=%5.2f-%5.2fi/n",d,f);
}
}
return 0;
}
2 迭代法求方程的根
/*
Source of subject: 计算方法 page200 例3
date: 2004-12-19 16:04
E.g: x=log10(x+2)
x0=1
Output:0.3758
Algorithm: 使用迭代法求方程的根
x_k+1=z(x_k) k=0,1...
*/
#include <math.h>
#include <stdio.h>
double z(double x)
{
return (log10(x+2));
}
iteration()
{
double x,temp;
int k=0;
x=temp=1;
do
{
temp=x; /*save xk for compare*/
x=z(x);
k++;
printf("the %d time is: %f/n",k,x);
}while(fabs(x-temp)>=0.0001);
}
main()
{
iteration();
getchar(); /*return until enter key!*/
return 0;
}
3 经典四级四阶R_K格式
/*
source:1.3 page21 例1.3
经典四级四阶R_K格式
date:2004-12-19
e.g: y'=y-2x/y,x∈[0,0.6]
y(0)=1
input: please enter the x0,y0: 1 -2
output:
The table (x,y) is:
(1.200000,0.381267)
(1.400000,0.729676)
(1.600000,1.051183)
(1.800000,1.350665)
(2.000000,1.632115)
(2.200000,1.898800)
(2.400000,2.153398)
(2.600000,2.398099)
(2.800000,2.634697)
(3.000000,2.864661)
arithmetic:使用经典四阶龙格-库塔算法进行高精度求解
y(i+1)=yi+( K1+ 2*K2 +2*K3+ K4)/6
K1=h*f(xi,yi)
K2=h*f(xi+h/2,yi+K1/2)
K3=h*f(xi+h/2,yi+K2/2)
K4=h*f(xi+h,yi+K3)
*/
#include"stdio.h"
#include"math.h"
float f(float x,float y)
{
return (-y+x+1);
}
R_K44()
{
float x0,y0,x,y;
float k1,k2,k3,k4;
float h=0.2;
printf("please enter the x0,y0: ");
scanf("%f,%f",&x0,&y0);
printf("The table (x,y) is:/n");
y=y0; /*赋初值*/
for(x=x0;x<3;x+=h)
{
k1=f(x,y);
k2=f(x+h/2,y+h*k1/2);
k3=f(x+h/2,y+h*k2/2);
k4=f(x+h,y+h*k3);
y+=h/6*(k1+2*k2+2*k3+k4);
/*y_x=0.5*((x+h)*(x+h)+2)*exp(-(x+h));*/ /*精确值*/
printf(" (%f,%f)/n ",x+h,y);
}
}
main()
{
R_K44();
}
4 Runge_Kutta_Fehlberg法
#include <stdio.h>
#include <math.h>
/* page25 例1.4 Runge_Kutta_Fehlberg法*/
main()
{
/*输入*/
double f(double,double);
double eps,q,r,k1,k2,k3,k4,k5,k6;
double x,x0,xn;
/*定义X的起点,终点*/
double y,y0,y_x,y_n,y__n;
/*定义Y的初值,精确解,Y_N是r_k四级四阶解,y__n是r_K_f解*/
double h,hmax,hmin;
/*定义最大步长,最小步长*/
scanf("%f%f%f%f%f%f",&x0,&xn,&y0,&eps,&hmax,&hmin);
x=x0;y=y0;h=hmax;
printf("初值:(%f,%f)",x,y);
for(x=x0;x<xn;x+=h)
{
k1=h*f(x,y);
k2=h*f(x+h/4,y+k1/4);
k3=h*f(x+3/8*h,y+3/32*k1+9/32*k2);
k4=h*f(x+12/13*h,y+1932/2197*k1-7200/2197*k2+7296/2197*k3);
k5=h*f(x+h,y+439/216*k1-8*k2+3680/513*k3-845/4104*k4);
k6=h*f(x+h/2,y-8/27*k1+2*k2-3544/2565*k3+1859/4104*k4-11/40*k5);
y_n+=25/216*k1+1408/2565*k3+2197/4104*k4-1/5*k5;
y__n+=16/135*k1+6656/12825*k3+28561/56430*k4-9/50*k5+2/55*k6;
r=(y__n-y_n)/h; /*误差R*/
q=0.84*pow(eps/r,0.25); /*控制步长Q*/
if(r<=eps) /*满足精度要求,用r_k四级四阶公式*/
{printf("(%f,%f,%f)",x,y_n,h); /*确定最佳步长*/
if(q<=0.1)h=0.1*h;
else if(q>=4.0)h=4*h;
else h=q*h;
if(h>hmax)h=hmax;
if(h<hmin)printf("fail");
}
y_x=(x+h)+exp(-(x+h));
printf(" (%1.8f,%1.8f,%1.8f,%1.8f) ",x+h,y_x,y__n,y__n-y_x); /*x,精确解,R-K_F解,误差*/
}
}
double f(double x,double y)
{double z;
z=-y+x+1;
return (z);
}
5 主元高斯消去法
#include <stdio.h>
#include <math.h>
#define N 50
main()
{
float b[N*(N+1)],a[N][N+1],max,temp,q;
int p[N],i,j,n,k,row,col,l=0;
printf("输入方程组的未知数个数:/n");
scanf("%d",&n);
printf("输入方程组的增广矩阵:/n");
for(i=0;i<n*(n+1);i++)
scanf("%f",&b[i]);
for(i=0;i<n;i++)
for(j=0;j<=n;j++)
a[i][j]=b[i*(n+1)+j];
for(i=0;i<n;i++)
p[i]=0;
for(k=0;k<n;k++)
{ max=0;
for(i=0;i<n;i++)
{ if(p[i]!=1)
{for(j=0;j<n;j++)
{ if(p[j]!=1)
{if(fabs(max)<fabs(a[i][j]))
{ max=a[i][j];row=i;col=j;}
}
}
}
}
if(max==0){printf("No only one");l=1;}
if(row!=col)
for(i=0;i<=n;i++)
{ temp=a[col][i];a[col][i]=a[row][i];
a[row][i]=temp;
}
q=1.0/a[col][col];
for(i=0;i<n+1;i++)
a[col][i]*=q;
for(i=0;i<n;i++)
{ if(i!=col)
{ temp=a[i][col];
for(j=0;j<n+1;j++)
a[i][j]-=(a[col][j]*temp);
}
}
p[col]=1;
}
if(l==0)
printf("方程解为:/n");
for(i=0;i<n;i++)
printf("x%d=%f/n",i,a[i][n]);
}
/*
运行测试结果:
(方程1)
输入方程组的未知数个数:
3
输入方程组的增广矩阵:
2 1 -3 5
4 5 1 3
1 2 1 0
方程解为:
x0=1.000000
x1=0.000000
x2=-1.000000
(方程2)
输入方程组的未知数个数:
3
输入方程组的增广矩阵:
0.0001 0.5402 0.3425 0.8828
1.235 2.567 0.9750 4.777
1.024 2.001 4.555 7.580
方程解为:
x0=1.000000
x1=1.000000
x2=1.000000
*/