首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >热方程解

热方程解
EN

Stack Overflow用户
提问于 2022-11-15 22:13:02
回答 1查看 60关注 0票数 0

当我试图绘制出热PDE的解时,我发现了一些麻烦。我找到了的解决方案

以下是代码:

代码语言:javascript
复制
#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/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/94400;
    for (n=1; n<N; n+=2){
     
        double pi=3.14159265358979323846;
        double t0=0.025;
        double result=b;
        result+=2*(1-pow((-1),n))/(pi*n)*(1-exp(-pow(n,2)*pow(pi,2)*pow(t0,2)))/(pow(n,2)*pow(pi,2))*sin(n*pi*x);
        }
    return result;
}

我要做的是声明一个函数,它计算n个奇数的无穷和,然后把它循环到0到1之间的每一个x。问题是,我不知道如何声明“结果”来作为所有项的和,因为如果我在for循环之外声明它,它不满足边界条件。

(请注意,我修复了t=0.025)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-15 22:27:18

根据该公式,您可以将f实现为:

代码语言:javascript
复制
#define M_PI 3.14159265358979323846;

double f(double x)
{
    int n;
    double result=43351.0/94400.0;
    double t0=0.025;

    for (n=1; n<N; n+=2){
        result+=2*(1-pow((-1),n))/(M_PI*n)*(1-exp(-pow(n,2)*pow(M_PI,2)*pow(t0,2)))/(pow(n,2)*pow(M_PI,2))*sin(n*M_PI*x);
    }
    return result;
}

因为您使用的是double,所以您必须显式地添加一个.0,否则它可能被认为是整数。

变量的声明被移出循环之外,以便澄清代码并确保变量result得到更新而不是被覆盖。

编辑:

您可以改进函数f,将t的值作为输入。这也符合所提供的方程式。然后,它将以这种方式实现:

代码语言:javascript
复制
double f(double x, double t)
{
    int n;
    double result=43351.0/94400.0;

    for (n=1; n<N; n+=2){
        result+=2*(1-pow((-1),n))/(M_PI*n)*(1-exp(-pow(n,2)*pow(M_PI,2)*pow(t,2)))/(pow(n,2)*pow(M_PI,2))*sin(n*M_PI*x);
    }
    return result;
}

编辑:

方程式的数学实现可以进一步简化:

  • a^2 b^2(ab)^2是一样的。
  • N个奇数的(-1)^n总是-1
  • 2*(1-pow((-1),n))4的替代品。

此外,从性能的角度来看,您可以通过将重复的术语放入变量并根据需要使用它们(例如,n^2 pi^2)来避免重复的术语的重新计算。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74452786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档