大学时的几道数值算法实现(code)

  1 多项式ax2+bx+c求解

/*
       author: denny [email protected]
       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
       author: denny [email protected]
       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格式
       author: denny [email protected]
       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
*/
 

你可能感兴趣的:(大学时的几道数值算法实现(code))