You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解热方程绘图遇阻:无穷求和变量声明问题求助

问题修复:热偏微分方程解的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:40:39