求解热方程绘图遇阻:无穷求和变量声明问题求助
问题修复:热偏微分方程解的C语言实现
核心问题分析
你的代码存在两个关键问题:
- 求和累加失效:变量
result被声明在for循环内部,每次循环都会重新将其初始化为b,根本无法实现各项累加的效果。 - 整数除法错误:
b=43351/94400是整数除法,结果会被截断为0,必须改为浮点除法才能得到正确的初始值。
此外还有可优化细节:pi、t0这类常量无需在循环内重复定义;n为奇数时1-pow(-1,n)恒等于2,直接替换可减少冗余计算。
修复后的代码
#include <string.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #define N 10000 double f(double x); double X[N]; double Y[N]; int main(){ int i; // 改为浮点除法,避免整数截断 double b=43351.0/94400; double dx=0.0001; X[0]=0; Y[0]=b; for (i=1; i<N; i++){ X[i]=X[i-1]+dx; Y[i]=f(X[i]); } FILE* output; output = fopen("dades.txt", "w"); fprintf(output, "x Posició Temperatura\n"); for (i = 0; i < N; i++){ fprintf(output, "%lf %lf %lf\n", i*dx, X[i], Y[i]); } fclose(output); return 0; } double f(double x){ int n; double b=43351.0/94400; // 常量移到循环外,避免重复定义 const double pi=3.14159265358979323846; const double t0=0.025; // result初始化放在循环外,实现累加 double result = b; for (n=1; n<N; n+=2){ // 利用n为奇数的特性简化计算 double term = 4/(pi*n) * (1-exp(-pow(n,2)*pow(pi,2)*pow(t0,2))) / (pow(n,2)*pow(pi,2)) * sin(n*pi*x); result += term; } return result; }
边界条件验证
当x=0时,sin(n*pi*0)=0,所有求和项的term都为0,最终result=b,完全符合边界要求,无需担心result声明在循环外的问题。
内容的提问来源于stack exchange,提问作者ErikLAndre
相关产品推荐
相关产品推荐

