c语言偏微分方程函数包,[转载]一个求解偏微分方程问题的C程序

#include

#include

#define vareps 0.02

#define gamma 0.1

#define pi 3.1415926535898

#define eps 1.0e-12

#define x1 0

#define x2 2*pi

//参数取值

double norm(double **a,int N,double h)

{

double b=0;

int i,j;

for(i=0;i

for(j=0;j

b+=a[i][j]*a[i][j]*h*h;

b=sqrt(b);

return b;

}//误差计算,其中空间网格数N,步长h

void main()

{

double **u0,**u,**uh,**e,*x,*y,r,h,tau,T;

int i,j,k,K,N;

FILE *fp=fopen("data.m","w");

FILE *fp0=fopen("data1.m","w");

printf("Printf T:n");

scanf("%lf",&T);//输入时间参数T

printf("Printf the length of tau:n");

scanf("%lf",&tau);//时间步长tau

printf("Printf N:n");

scanf("%d",&N);//空间网格数N

K=(int)(T/tau)+1;

h=(x2-x1)/N;//空间步长h

N++;

r=tau/(h*h);//网比r

uh=new double*[N];

for(i=0;i

uh[i]=new double[N];

u0=new double*[N];

for(i=0;i

u0[i]=new double[N];

u=new double*[N];

for(i=0;i

u[i]=new double[N];

e=new double*[N];

for(i=0;i

e[i]=new double[N];

x=new double[N];

y=new double[N];

for(i=0;i

{

x[i]=x1+i*h;y[i]=x[i];

}

for(i=0;i

for(j=0;j

if((x[i]-pi)*(x[i]-pi)+(y[j]-pi)*(y[j]-pi)<0.25)

u[i][j]=1;

else u[i][j]=-1;

fprintf(fp0,"x=[");

for(i=0;i

fprintf(fp0,"%lft",x[i]);

fprintf(fp0,"];ny=[");

for(i=0;i

fprintf(fp0,"%lft",y[i]);

fprintf(fp0,"];nz=[");

for(i=0;i

{

for(j=0;j

fprintf(fp0,"%et",u[i][j]);

fprintf(fp0,"n");

}

fprintf(fp0,"];nfigure,surf(x,y,z)nfigure,contour(x,y,z)n");//输出初始条件

for(k=1;k

{

for(i=0;i

for(j=0;j

uh[i][j]=u[i][j];

while(1)

{

for(i=0;i

for(j=0;j

u0[i][j]=u[i][j];

u[0][0]=(uh[0][0]/tau/gamma+2/h/h*(u[0][1]+u[1][0])-u[0][0]

*u[0][0]*u[0][0]/vareps/vareps)/(1/tau/gamma+4/h/h-

1/vareps/vareps);

u[N-1][0]=(uh[N-1][0]/tau/gamma+2/h/h*(u[N-1][1]+u[N-2][0])-

u[N-1][0]*u[N-1][0]*u[N-1][0]/vareps/vareps)/(1/tau

/gamma+4/h/h-1/vareps/vareps);

u[0][N-1]=(uh[0][N-1]/tau/gamma+2/h/h*(u[0][N-2]+u[1][N-1])-

u[0][N-1]*u[0][N-1]*u[0][N-1]/vareps/vareps)/(1/tau

/gamma+4/h/h-1/vareps/vareps);

u[N-1][N-1]=(uh[N-1][N-1]/tau/gamma+2/h/h*(u[N-2][N-1]+u[N-1]

[N-2])-u[N-1][N-1]*u[N-1][N-1]*u[N-1][N-1]/vareps

/vareps)/(1/tau/gamma+4/h/h-1/vareps/vareps);

for(i=1;i

{ u[i][0]=(uh[i][0]/tau/gamma+1/h/h*(2*u[i][1]+u[i-1][0]+u[i+1][0])

-u[i][0]*u[i][0]*u[i][0]/vareps/vareps)/(1/tau/gamma+4/h/

h-1/vareps/vareps);

u[i][N-1]=(uh[i][N-1]/tau/gamma+1/h/h*(2*u[i][N-2]+u[i-1][N-1]+

u[i+1][N-1])-u[i][N-1]*u[i][N-1]*u[i][N-1]/vareps/vareps)

/(1/tau/gamma+4/h/h-1/vareps/vareps);

u[0][i]=(uh[0][i]/tau/gamma+1/h/h*(u[0][i+1]+u[0][i-1]+2*u[1][i])-

u[0][i]*u[0][i]*u[0][i]/vareps/vareps)/(1/tau/gamma+4/h/h-

1/vareps/vareps);

u[N-1][i]=(uh[N-1][i]/tau/gamma+1/h/h*(u[N-1][i+1]+u[N-1][i-1]+2*

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
偏微分方程的隐格式求解通常需要使用迭代算法,其中最常用的方法是迭代法和牛顿法。这些算法可以使用C语言实现。以下是一个简单的隐式格式求解偏微分方程C语言代码示例: ```c #include <stdio.h> #include <math.h> #define N 100 // 网格数 #define T 1.0 // 时间 #define D 0.1 // 扩散系数 double u[N][N]; // 解向量 double f(double x, double y, double t) { return sin(x) * sin(y) * exp(-t); } void solve() { double dt = T / N; double dx = 1.0 / (N-1); // 初始化解向量 for (int i=0; i<N; i++) { for (int j=0; j<N; j++) { u[i][j] = f(i*dx, j*dx, 0); } } // 迭代求解 for (int k=1; k<N; k++) { double t = k * dt; // 构造系数矩阵和右侧向量 double A[N][N] = {0}; double b[N] = {0}; for (int i=1; i<N-1; i++) { for (int j=1; j<N-1; j++) { A[i][j] = 1 + 2*D*dt/(dx*dx); A[i][j-1] = -D*dt/(dx*dx); A[i][j+1] = -D*dt/(dx*dx); b[i] = u[i][j] + dt*f(i*dx, j*dx, t); } } // 利用高斯-赛德尔迭代求解 double eps = 1e-6; double err = 1.0; int iter = 0; while (err > eps) { err = 0; for (int i=1; i<N-1; i++) { double tmp = b[i]; for (int j=1; j<N-1; j++) { if (i != j) { tmp -= A[i][j]*u[i][j]; } } tmp /= A[i][i]; err += fabs(tmp-u[i][i]); u[i][i] = tmp; } iter++; } printf("iter=%d, err=%.6f\n", iter, err); } } int main() { solve(); return 0; } ``` 该代码使用了隐式格式和高斯-赛德尔迭代算法来求解二维热传导方程,其中函数`f`表示初始条件。在`solve`函数中,首先对解向量进行初始化,然后利用隐式格式构造系数矩阵和右侧向量,最后使用高斯-赛德尔迭代算法求解线性方程组。在主函数中调用`solve`函数即可进行求解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值