本文档提供了牛顿法、列主元素消去法、LU分解法三类求解方程的代码,对应非线性方程及线性方程组。利用C语言编写,采用txt文件输入、输出方式。
/*牛顿法求解非线性方程*/
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
float f(float x)  /* 定义函数f(x) */
{  return 2*x*x+2*x+1-exp(2*x);  }
float f1(float x)  /* 定义函数f(x)的导数f1(x) */
{  return 4*x+2-2*exp(2*x);  }
main()
{float x0,x1,eps; /*定义初值和迭代精度*/
FILE *fp1,*fp2;
if((fp1=fopen("in.txt","r"))==NULL)
  {printf("Can't open this file!\n");
  exit(0);
  }
  fscanf(fp1,"%f %f",&x1,&eps);
do
{
    x0=x1;
    if(fabs(f(x0))<=eps)  x1=x0;
    else
        x1=x0-f(x0)/f1(x0); /*牛顿迭代*/
    }
    while(fabs(f(x1))>eps); /*循环条件*/
    fp2=fopen("","w");
    fprintf(fp2,"%e",x1); 
    fclose(fp1);
    fclose(fp2);
}
/*列主元素消去法求解线性方程组*/
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 3
void main()
{  int i,j,k,mi;                                /*定义变量类型*/
  float max,temp;
  float a[N][N],b[N],x[N],r[N][N+1];
 
  FILE *fp1;                                      /*输入系数矩阵及列向量b*/
  if((fp1=fopen("in.txt","r"))==NULL)
  {
c语言写入txt文件
    printf("Can't open this file!\n");
    exit(0);
  }
  for(i=0;i<N;i++)
    for(j=0;j<N+1;j++)
      fscanf(fp1,"%f",&r[i][j]);
  fclose(fp1);
 
  for(i=0;i<N;i++)
    for(j=0;j<N;j++)
        a[i][j]=r[i][j];
  for(i=0;i<N;i++)
      b[i]=r[i][N];
   
 
  for(j=0;j<N-1;j++)                          /*出列主元素并交换*/
  {
    for(i=j+1,mi=j,max=fabs(a[j][j]);i<N;i++)
    if(fabs(a[i][j])>max)
    {
        mi=i;
        max=fabs(a[i][j]);
    }
    if(j<mi)
    {
      temp=b[j];
      b[j]=b[mi];
      b[mi]=temp;
      for(k=j;k<N;k++)
      {
        temp=a[j][k];
        a[j][k]=a[mi][k];
        a[mi][k]=temp;
      }
    }
    for(i=j+1;i<N;i++)
    {temp=-a[i][j]/a[j][j];
    b[i]+=b[j]*temp;
    for(k=j;k<N;k++)
      a[i][k]+=a[j][k]*temp;
    }
  }
  x[N-1]=b[N-1]/a[N-1][N-1];              /*消去求解*/
  for(i=N-2;i>=0;i--)
  {
    x[i]=b[i];
    for(j=i+1;j<N;j++)
      x[i]-=a[i][j]*x[j];
    x[i]/=a[i][i];
  }
  FILE *fp2;
  fp2=fopen("","w");
  for(i=0;i<N;i++)
      fprintf(fp2,"x[%d]=%f\n",i+1,x[i]);
  fclose(fp2);
}
           
       
/*线性方程组的LU分解法*/
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 3
void main()
{  int i,j,k,n;
  float temp;
  float a[N][N],b[N],x[N],y[N],L[N][N],U[N][N],r[N][N+1];
 
  FILE *fp1;                                     
  if((fp1=fopen("in.txt","r"))==NULL)
  {
    printf("Can't open this file!\n");
    exit(0);
  }
  for(i=0;i<N;i++)
    for(j=0;j<N+1;j++)
      fscanf(fp1,"%f",&r[i][j]);
  fclose(fp1);
 
  for(i=0;i<N;i++)
    for(j=0;j<N;j++)
        a[i][j]=r[i][j];
  for(i=0;i<N;i++)
      b[i]=r[i][N];
for(i=0;i<N;i++)                    /*矩阵分解*/
  {
      U[0][i]=a[0][i];
      L[i][i]=1.0;
      L[i][0]=a[i][0]/a[0][0];
      for(j=i+1;j<N;j++)
      {  L[i][j]=0;
          U[j][i]=0;
      }
  }
 
  for(i=1;i<N;i++)
  {
    for(j=i;j<N;j++)
    {
      temp=0;
      for(k=0;k<i;k++)
        temp=temp+L[i][k]*U[k][j];
      U[i][j]=a[i][j]-temp;
      }
      for(j=i;j<N;j++)
      {
        temp=0;
        for(k=0;k<i;k++)
        temp=temp+L[j][k]*U[k][i];
        L[j][i]=(a[j][i]-temp)/U[i][i];
      }
  }
 
  y[0]=b[0];                        /*解该线性方程组*/
  for(i=1;i<N;i++)
  {
    temp=0;
    for(j=0;j<i;j++)
    temp=temp+L[i][j]*y[j];
    y[i]=b[i]-temp;
    }
    x[N-1]=y[N-1]/U[N-1][N-1];
    for(i=N-2;i>=0;i--)
    {
      x[i]=y[i];
      for(j=i+1;j<N;j++)
      x[i]-=U[i][j]*x[j];
      x[i]/=U[i][i];
    }
   
    FILE *fp2;
  fp2=fopen("","w");
  for(i=0;i<N;i++)
    fprintf(fp2,"x[%d]=%f\n",i+1,x[i]);
  fclose(fp2);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。