# 微分方程数值解法C语言

一：预报矫正格式
#include <math.h>
#include<iostream>
#include<stdlib.h>
double count_0( double xn,double yn){
//矫正格式
double s;
s=yn+0.1*(yn/xn*0.5+xn*xn/yn*0.5);
return s;
}
double count_1(double xn,double yn,double y0){
//预报格式
double s;
s=yn+0.05*((yn/xn*0.5+xn*xn/yn*0.5)+(y0/xn*0.5+xn*xn/y0*0.5));
return s;
}
void main(){
//计算,步长为0.1,进行10次计算,设初始值毕业论文http://www.lwfree.cn
double xn=1,yn=1;
int i=1;
while(i<=10){
printf("%16f ,%1.16f ,%1.16f \n",xn,yn,count_1(xn,yn,count_0(xn,yn)));
xn=xn+0.1;
yn=count_1(xn,yn,count_0(xn,yn));
i++;
}
}
二 显示差分格式
#include<iostream>
#include<math.h>
#include<stdlib.h>
main(){
double a[6][11];
//初始化；
for(int i=0;i<=5;i++)
{a[0]=0;a[10]=0;}
for(int j=1;j<10;j++)
{
double p=3.14*j*0.1;
a[0][j]=sin(p);
}
//按显示格式计算
for(i=1;i<=5;i++)
for(j=1;j<10;j++)
a[j]=a[i-1][j-1]+a[i-1][j+1];
//输出计算好的矩阵
for(i=0;i<=5;i++)
{
for(j=0;j<11;j++)
printf("%1.10f ",a[j]);
printf("\n");
}
}
三 龙阁库塔格式
#include <math.h>
#include<iostream>
#include<stdlib.h>
double count_k( double xn,double yn){
double s;
s=yn/xn*0.5+xn*xn/yn*0.5;
return s;
}
void main(){
//步长为0.1
double xn=1,yn=1;
int i=1;
while(i<=11){
printf("%f ,%f\n",xn,yn);
double k1=count_k(xn,yn);
double k2=count_k(xn+0.05,yn+0.05*k1);
double k3=count_k(xn+0.05,yn+0.05*k2);
double k4=count_k(xn+0.01,yn+0.1*k3);
yn=yn+0.1/6*(k1+2*k2+2*k3+k4);
xn=xn+0.1;
i++;
}
}

四 CRANK--NICOLSON隐式格式
#include<iostream>
#include<math.h>
#include<stdlib.h>
double Surplus(double A[],int m,int n);
double * MatrixInver(double A[],int m,int n);
double * MatrixOpp(double A[],int m,int n) /*矩阵求逆*/
{
int i,j,x,y,k;
double *SP=NULL,*AB=NULL,*B=NULL,X,*C;
SP=(double *)malloc(m*n*sizeof(double));
AB=(double *)malloc(m*n*sizeof(double));
B=(double *)malloc(m*n*sizeof(double));
X=Surplus(A,m,n);
X=1/X; 毕业论文http://www.lwfree.cn
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{for(k=0;k<m*n;k++)
B[k]=A[k];
{for(x=0;x<n;x++)
B[i*n+x]=0;
for(y=0;y<m;y++)
B[m*y+j]=0;
B[i*n+j]=1;
SP[i*n+j]=Surplus(B,m,n);
AB[i*n+j]=X*SP[i*n+j];
}
}
C=MatrixInver(AB,m,n);
return C;
}
double * MatrixInver(double A[],int m,int n) /*矩阵转置*/
{
int i,j;
double *B=NULL;
B=(double *)malloc(m*n*sizeof(double));
for(i=0;i<n;i++)
for(j=0;j<m;j++)
B[i*m+j]=A[j*n+i];
return B;
}
double Surplus(double A[],int m,int n) /*求矩阵行列式*/
{
int i,j,k,p,r;
double X,temp=1,temp1=1,s=0,s1=0;
if(n==2)
{for(i=0;i<m;i++)
for(j=0;j<n;j++)
if((i+j)%2) temp1*=A[i*n+j];
else temp*=A[i*n+j];
X=temp-temp1;}
else{
for(k=0;k<n;k++)
{for(i=0,j=k;i<m,j<n;i++,j++)
temp*=A[i*n+j];
if(m-i)
{for(p=m-i,r=m-1;p>0;p--,r--)
temp*=A[r*n+p-1];}
s+=temp;
temp=1;
}
for(k=n-1;k>=0;k--)
{for(i=0,j=k;i<m,j>=0;i++,j--)
temp1*=A[i*n+j];
if(m-i)
{for(p=m-1,r=i;r<m;p--,r++)
temp1*=A[r*n+p];}
s1+=temp1;
temp1=1;
}
X=s-s1;}
return X;
}
void initmat_A(double a[][9],double r){
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
a[j]=0;
for(i=0;i<9;i++){
a=1+r;
if(i!=8) a[i+1]=-0.5*r;
if(i!=0) a[i-1]=-0.5*r;
}
}
void initmat_B(double b[][9],double r){
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
b[j]=0;
for( i=0;i<9;i++){
b=1-r;
if(i!=8) b[i+1]=0.5*r;
if(i!=0) b[i-1]=0.5*r;
}
}
void initmat_C(double C[][9]){
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
C[j]=0;
}
void main(){
double a[100][11];
for(int i=0;i<100;i++)
for(int j=0;j<11;j++)
a[j]=0;
//初始化；
for(i=0;i<100;i++)
{a[0]=0;a[10]=0;}
for(int j=1;j<10;j++)
{
double p=4*3.14*j*0.1;
a[0][j]=sin(p);
}
//取h=0.1*3.14,r=0.0005，t=0.0001*3.14*3.14;
//得到矩阵a和矩阵b
double A[9][9];initmat_A(A,0.005);
double B[9][9];initmat_B(B,0.005);
//B矩阵与Un相乘,en是0;
double C[9][9];initmat_C(C);
double *A_;
A_=MatrixOpp(A[0],9,9);//A矩阵求逆；
//A逆*B 毕业论文http://www.lwfree.cn
for(i=0;i<9;i++)
for(j=0;j<9;j++)
for(int s=0;s<9;s++)
C[j]+=A_[i*9+s]*B[s][j];
//填写a表格
for(i=0;i<100;i++)
{
for(j=1;j<10;j++)
for(int s=0;s<9;s++)
a[i+1][j]+=a[s+1]*C[j-1][s];
}
//输出表格
for(i=0;i<100;i++)
{
for(j=0;j<11;j++)
printf("%1.8f ",a[j]);
printf("\n");
}
printf("\n"); printf("\n");
//利用精确解，求出表格
for(i=0;i<100;i++)
{
for(j=0;j<11;j++)
printf("%1.8f ",exp(-16*0.0001*0.0005*3.14*3.14*i)*sin(4*j*0.1*3.14));
printf("\n");
}
}