高斯消元法

高斯消元法
 
方法1:
 
#include "stdio.h"
#include "stdlib.h"
 
voidRKT(t,y,n,h,k,z)
intn;                                      /*微分方程组中方程的个数,也是未知函数的个数*/
intk;                                      /*积分的步数(包括起始点这一步)*/
doublet;                     /*积分的起始点t0*/
doubleh;                    /*积分的步长*/
doubley[];                           /*存放n个未知函数在起始点t处的函数值,返回时,其初值在二维数组z的第零列中*/
doublez[];                           /*二维数组,体积为n x k.返回k个积分点上的n个未知函数值*/
{
         externvoidFunc();                                  /*声明要求解的微分方程组*/
    inti,j,l;
    doublea[4],*b,*d;
    b=malloc(n*sizeof(double));                  /*分配存储空间*/
         if(b == NULL)
         {
                   printf("内存分配失败/n");
                   exit(1);
         }
    d=malloc(n*sizeof(double));                  /*分配存储空间*/
         if(d == NULL)
         {
                   printf("内存分配失败/n");
                   exit(1);
         }
         /*后面应用RK4公式中用到的系数*/
    a[0]=h/2.0;                                               
         a[1]=h/2.0;
    a[2]=h;
         a[3]=h;
    for(i=0; i<=n-1; i++)
                  z[i*k]=y[i];                                     /*将初值赋给数组z的相应位置*/
    for(l=1; l<=k-1; l++)
    {
                  Func(y,d);
        for (i=0; i<=n-1; i++)
                            b[i]=y[i];
        for (j=0; j<=2; j++)
        {
                            for (i=0; i<=n-1; i++)
            {
                                     y[i]=z[i*k+l-1]+a[j]*d[i];
                b[i]=b[i]+a[j+1]*d[i]/3.0;
            }
            Func(y,d);
        }
        for(i=0; i<=n-1; i++)
          y[i]=b[i]+h*d[i]/6.0;
        for(i=0; i<=n-1; i++)
          z[i*k+l]=y[i];
        t=t+h;
         }
    free(b);                          /*释放存储空间*/
         free(d);                         /*释放存储空间*/
    return;
}
main()
{
         inti,j;
    doublet,h,y[3],z[3][11];
    y[0]=-1.0;
         y[1]=0.0;
         y[2]=1.0;
    t=0.0;
         h=0.01;
    RKT(t,y,3,h,11,z);
    printf("/n");
    for (i=0; i<=10; i++)                            /*打印输出结果*/
    {
                   t=i*h;
        printf("t=%5.2f/t   ",t);
        for (j=0; j<=2; j++)
          printf("y(%d)=%e ",j,z[j][i]);
        printf("/n");
         }
}
 
voidFunc(y,d)
doubley[],d[];
{
         d[0]=y[1];          /*y0'=y1*/
         d[1]=-y[0];                  /*y1'=y0*/
         d[2]=-y[2];                  /*y2'=y2*/
         return;
}

高斯消元法:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
 
intGS(int,double**,double *,double);
double **TwoArrayAlloc(int,int);
voidTwoArrayFree(double **);
 
voidmain()
{
         inti,n;
         doubleep,**a,*b;
         n = 3;
         ep = 1e-4;
         a = TwoArrayAlloc(n,n);
         b = (double *)calloc(n,sizeof(double));
         if(b == NULL)
         {
                   printf("内存分配失败/n");
                   exit(1);
         }
         a[0][0]= 2; a[0][1]= 6; a[0][2]=-1;
         a[1][0]= 5; a[1][1]=-1; a[1][2]= 2;
         a[2][0]=-3; a[2][1]=-4; a[2][2]= 1;
         b[0] = -12; b[1] = 29; b[2] = 5;
         if(!GS(n,a,b,ep))
         {
                   printf("不可以用高斯消去法求解/n");
                   exit(0);
         }
         printf("该方程组的解为:/n");
         for(i=0;i<3;i++)
                  printf("x%d = %.2f/n",i,b[i]);
         TwoArrayFree(a);
         free(b);
}
 
intGS(n,a,b,ep)
intn;
double **a;
double *b;
doubleep;
{
         inti,j,k,l;
         doublet;
         for(k=1;k<=n;k++)
         {
                  for(l=k;l<=n;l++)
                            if(fabs(a[l-1][k-1])>ep)
                                     break;
                            elseif(l==n)
                                     return(0);
                   if(l!=k)
                   {
                            for(j=k;j<=n;j++)
                            {
                                     t = a[k-1][j-1];
                                     a[k-1][j-1]=a[l-1][j-1];
                                     a[l-1][j-1]=t;
                            }
                            t=b[k-1];
                            b[k-1]=b[l-1];
                            b[l-1]=t;
                   }
                  t=1/a[k-1][k-1];
                  for(j=k+1;j<=n;j++)
                            a[k-1][j-1]=t*a[k-1][j-1];
                  b[k-1]*=t;
                  for(i=k+1;i<=n;i++)
                   {
                            for(j=k+1;j<=n;j++)
                                     a[i-1][j-1]-=a[i-1][k-1]*a[k-1][j-1];
                            b[i-1]-=a[i-1][k-1]*b[k-1];
                   }
         }
         for(i=n-1;i>=1;i--)
                  for(j=i+1;j<=n;j++)
                            b[i-1]-=a[i-1][j-1]*b[j-1];
return(1);
}
 
double **TwoArrayAlloc(intr,intc)
{
         double *x,**y;
         intn;
         x=(double *)calloc(r*c,sizeof(double));
         y=(double **)calloc(r,sizeof(double*));
         for(n=0;n<=r-1;++n)
                  y[n]=&x[c*n];
         return (y);
}
 
voidTwoArrayFree(double **x)
{
         free(x[0]);
         free(x);
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值