數值分析C程序

I顯示方法

#include <stdio.h>

#define HEIGHT 17

int main(void)
{

	int i=0;
	printf("\n\nIIIIIII\n");
	while (i<HEIGHT)
	{
		printf("  III\n");
		i++;
    }
	printf("IIIIIII\n\n\n");

	return 0;
}

埃特肯

#include<stdio.h>
#include<math.h>
float f(float a)
{float b;
 b=pow(2,-a);
 return b;
}

main()
{float x0,x1,e,y,z;
 int k;
 scanf("%f,%f",&x0,&e);
 for(k=0;k<100;k++)
  {y=f(x0);
   z=f(y);
   x1=x0-(y-x0)*(y-x0)/(z-2*y+x0);
   if(fabs(x1-x0)<e)
    {printf("%f",x1);
     break;
    }
   else x0=x1;
  }
}

杜氏分解法

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

main()
{int n,i,j,k,t,sum;
 float a[10][10],b[10],x[10],y[10];
 printf("the top exp is ");
 scanf("%d",&n);
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
   scanf("%d",&a[i][j]);
 for(i=0;i<n;i++)
  scanf("%d",&b[i]);
 for(i=1;i<n;i++)
  a[i][1]=a[i][1]/a[1][1];
   for(k=1;k<n;k++)
    {for(j=k;j<n;j++)
      {sum=0;
       for(t=0;t<k;t++)
	sum+=a[k][t]*a[t][j];
       a[k][j]=a[k][j]-sum;
      }
     if(k!=n-1)
      {for(i=k+1;i<n;i++)
	{sum=0;
	 for(t=0;t<k;t++)
	  sum+=a[i][t]*a[t][k];
	 a[i][k]=(a[i][k]-sum)/a[k][k];
	}
      }
    }
 y[0]=b[0];
 for(i=1;i<n;i++)
  {sum=0;
   for(k=0;k<i;k++)
    sum+=a[i][k]*y[k];
   y[i]=b[i]-sum;
  }
 x[n-1]=y[n-1]/a[n-1][n-1];
 for(i=n-2;i>=0;i--)
  {sum=0;
   for(k=i+1;k<n;k++)
    sum+=a[i][k]*x[k];
   x[i]=(y[i]-sum)/a[i][i];
  }
 for(i=0;i<n;i++)
  printf("%f\n",x[i]);
}

二分法

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

float f(float x)
{float y;
 y=x*x+2*x+1;
 return y;
}

main()
{float a,b,c,x;
 printf("%s","input three numbers:\n");
 scanf("%f%f%f",&a,&b,&c);
 while(fabs(b-a)>=c)
  {x=(a+b)/2;
   if(f(x)!=0)
    {if(f(a)*f(x)<0)
      b=x;
     else a=x;}
   else a=x,b=x;
  }
 printf("%f\n",(a+b)/2);
}

分段線性插值

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

main()
{int e,h,i,j,k,n;
 float x[10],y[10],a,sum,total,e1,e2;
 printf("input n\n");
 scanf("%d",&n);
 printf("input X\n");
 for(i=0;i<=n;i++)
  scanf("%f",&x[i]);
 printf("input Y\n");
 for(i=0;i<=n;i++)
  scanf("%f",&y[i]);
 printf("input x\n");
 scanf("%f",&a);
 for(j=1;j<=n;j++)
  if(x[j-1]<=a&&a<=x[j])
   e=j;
  if(e==1)
   h=j;
  else if(e==n)
	h=j-1;
       else {e1=fabs(a-x[j-2]);
	     e2=fabs(a-x[j+1]);
	     if(e1<e2)
	      h=j-1;
	     else h=j;}
 sum=0;
 for(k=h-1;k<=h+1;k++)
  {total=1;
   for(j=h-1;j<k;j++)
    total*=((a-x[j])/(x[k]-x[j]));
   for(j=k+1;j<=h+1;j++)
    total*=((a-x[j])/(x[k]-x[j]));
   sum+=y[k]*total;
  }
 printf("x=%f,L=%f",a,sum);
}

複合梯形法

#include<stdio.h>
#include<math.h>
#define f(x) 4/(1+(x)*(x))
float g(int k)
{int i,total;
 total=1;
 for(i=1;i<=k;i++)
  total*=2;
 return total;
}

main()
{int i,k,k0,k1,tag;
 float a,b,e,e1,t[50],sum;
 scanf("%f,%f,%f,%d,%d",&a,&b,&e,&k0,&k1);
 t[0]=((b-a)*(f(1)-f(0)))/2;
 k=1;
 tag=0;
 do{sum=0;
    for(i=1;i<=g(k-1);i++)
     sum+=f(a+(2*i-1)*(b-a)/g(k));
    t[k]=t[k-1]/2+(b-a)*sum/g(k);
    if(k>=k1)
     {e1=fabs(t[k]-t[k-1]);
      if(e1<e)
       {printf("k=%d,T=%f\n",k,t[k]);
	tag=1;
       }
     }
    k++;
   }while(tag==0&&k<k0);
   if(tag==0||k>=k0)
    printf("error!\n");
}

複合辛普森

#include<stdio.h>
#include<math.h>
#define f(x) (x)/(4+(x)*(x))

main()
{int k,n;
 float a,b,h,s,x;
 scanf("%f,%f,%d",&a,&b,&n);
 h=(b-a)/(2*n);
 x=a;
 s=f(x)-f(b);
 k=1;
 do
 {x=x+h;s=s+4*f(x);
  x=x+h;s=s+2*f(x);
  k++;
 }while(k<=n);
 s=(s*h)/3;
 printf("s=%f\n",s);
}

改進歐拉法

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

main()
{float a[10][10],b[10],m[10][10],x[10],sum;
 int i,j,k,n;
 printf("the top exp:");
 scanf("%d",&n);
 printf("\n");
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
   scanf("%f",&a[i][j]);
    for(i=0;i<n;i++)
     scanf("%f",&b[i]);
      for(k=0;k<n-1;k++)
      {if(a[k][k]==0)
       printf("error");
	else for(i=k+1;i<n;i++)
	     {m[i][k]=a[i][k]/a[k][k];
	      a[i][k]=m[i][k];
	      b[i]=b[i]-m[i][k]*b[k];
	 for(j=k+1;j<n;j++)
	  a[i][j]=a[i][j]-m[i][k]*a[k][j];
      }}
 if(a[n-1][n-1]==0)
  printf("error");
 else x[n-1]=b[n-1]/a[n-1][n-1];
 b[n-1]=x[n-1];
 for(i=n-2;i>=0;i--)
 {sum=0;
  for(j=i+1;j<n;j++)
   {sum+=a[i][j]*x[j];}
    x[i]=(b[i]-sum)/a[i][i];
    b[i]=x[i];
   }
 for(i=0;i<n;i++)
 printf("%f\n",x[i]);
}

簡單迭代

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

float f(float x)
{float y;
 y=sqrt(10/(4+x));
 return y;
}

main()
{float x0,x1,a;
 int k,N;
 k=0;
 scanf("%f,%f,%d",&x0,&a,&N);
 for(k=0;k<N;k++)
  {x1=f(x0);
   if(fabs(x1-x0)<a)
    {printf("%d,%f",k,x1);
     break;
    }
   else x0=x1;
  }
 if(k>=N)
  {printf("error");
  }
}

列主元元素消元

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

main()
{float a[10][10],b[10],s,t,e,sum;
 int i,j,k,n,m;
 printf("The top exp is ");
 scanf("%d",&n);
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
   scanf("%f",&a[i][j]);
 for(i=0;i<n;i++)
  scanf("%f",&b[i]);
 scanf("%f",&e);
 k=0;
 do{t=a[k][k];
    for(i=k;i<n;i++)
     {if(fabs(t)<fabs(a[i][k]))
       {t=a[i][k];
	m=i;
       }
      else m=k;
     }
     if(fabs(t)<e)
      printf("det A = 0\n");
     else {if(m!=k)
	    {for(j=0;j<n;j++)
	      {s=a[m][j];
	       a[m][j]=a[k][j];
	       a[k][j]=s;
	      }
	     s=b[m];
	     b[m]=b[k];
	     b[k]=s;
	    }
	   for(i=k+1;i<n;i++)
	    for(j=k+1;j<n;j++)
	     {a[i][k]=a[i][k]/a[k][k];
	      a[i][j]=a[i][j]-a[i][k]*a[k][j];
	      b[i]=b[i]-a[i][k]*b[k];
	     }
	  }
    k++;
   }while(k<n-2);
  if(fabs(a[n-1][n-1])<e)
   printf("det A = 0\n");
  else {b[n-1]=b[n-1]/a[n-1][n-1];
	for(i=n-2;i>=0;i--)
	 {sum=0;
	  for(k=i+1;k<n;k++)
	   {sum+=a[k][j]*b[j];}
	  b[i]=(b[i]-sum)/a[i][i];
	 }
       }
  for(i=0;i<n;i++)
   printf("%f\n",b[i]);
}

龍貝格算法

#include<stdio.h>
#include<math.h>
#define f(x) 4/(1+(x)*(x))
float g(int k)
{int i,total;
 total=1;
 for(i=1;i<=k;i++)
  total*=2;
 return total;
}

main()
{int k0,k1,k,tag,i;
 float a,b,e,e1,t[50],s[50],c[50],r[50],sum;
 scanf("%f,%f,%f,%d,%d",&a,&b,&e,&k0,&k1);
 t[0]=(b-a)*(f(0)+f(1))/2;
 k=1;
 tag=0;
 do{if(k==1)
     {t[1]=t[0]/2+(b-a)*f(a+(b-a)/2)/2;
      s[0]=(4*t[1]-t[0])/3;
     }
    if(k==2)
     {t[2]=t[1]/2+(b-a)*(f(a+(b-a)/4)+f(a+3*(b-a)/4))/4;
      s[1]=(4*t[2]-t[1])/3;
      c[0]=(16*s[1]-s[0])/15;
     }
    if(k>=3)
     {sum=0;
      for(i=1;i<=g(k-1);i++)
       sum+=f(a+(2*i-1)*(b-a)/g(k));
      t[k]=t[k-1]/2+(b-a)*sum/g(k);
      s[k-1]=(4*t[k]-t[k-1])/3;
      c[k-2]=(16*s[k-1]-s[k-2])/15;
      r[k-3]=(64*c[k-2]-c[k-3])/63;
     }
    if(k>=k1)
     {e1=fabs(r[k-3]-r[k-4]);
      if(e1<e)
       {printf("k=%d,T=%f\n",k,r[k-3]);
	tag=1;
       }
     }
    k++;
   }while(tag==0&&k<k0);
  if(tag==0||k>=k0)
   printf("error!\n");
}

龍格庫塔方法

#include<stdio.h>
#include<math.h>
#define f(x,y) (x)-(y)+1

main()
{int n,k;
 float a,b,y0,h,x,y,t[4];
 scanf("%f,%f,%f,%d",&a,&b,&y0,&n);
 h=(b-a)/n;
 x=a;y=y0;
 printf("%f,%f\n",x,y);
 k=1;
 do{t[0]=f(x,y);
    x=x+h/2;
    t[1]=f(x,y+h*t[0]/2);
    t[2]=f(x,y+h*t[1]/2);
    x=x+h/2;
    t[3]=f(x,y+h*t[2]);
    y=y+h*(t[0]+2*t[1]+2*t[2]+t[3])/6;        //龍格庫塔公式
    printf("%f,%f\n",x,y);
    k++;
   }while(k<=n);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章