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

热方程的数值解
EN

Stack Overflow用户
提问于 2022-11-16 12:08:36
回答 2查看 40关注 0票数 -1

在用解析法求解热方程之后,我试图用显式欧拉法数值求解它。我得到了后续离散化,其中T是温度。我的代码是:

代码语言:javascript
复制
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define N 100

double T[N+1][N];

int main(){
    int i,j;
    double dt=1./N;
    double dz=1./N;
    double b=43351./94400;
    for (i=0;i<N+2;i++){
        T[i][0]=b;
        T[i][N-1]=b;
    }
    
    for (j=0;j<N+1;j++){
        T[0][j+1]=b;
    }
    for (i=0;i<N+1;i++){
        for (j=1;j<N;j++){
            T[i+1][j] = (dt/pow(dz, 2))*(T[i][j+1] - 2*T[i][j] + T[i][j-1]) + dt + T[i][j];
            
        }
    }

    FILE* output;
    
    output = fopen("numerica.txt", "w");
    
    for (i=0;i<N+2;i++){
        for (j=0;j<N+1;j++){
            fprintf(output, "%lf\t", T[i][j]);
        }
        fprintf(output,"\n");
    }
    fclose(output);
    return 0;
        
}

我要做的是创建一个保存函数中所有值的N+1xN矩阵。编译之后,我有一个无限的.txt文件。有人帮忙吗?

EN

回答 2

Stack Overflow用户

发布于 2022-11-16 12:21:05

输出文件应该有102行,除非程序崩溃,因为您的循环是错误的。

代码语言:javascript
复制
$ gcc -O -Wall t.c 
t.c: In function ‘main’:
t.c:35:13: warning: iteration 100 invokes undefined behavior [-Waggressive-loop-optimizations]
   35 |             fprintf(output, "%lf\t", T[i][j]);
      |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
t.c:34:19: note: within this loop
   34 |         for (j=0;j<N+1;j++){
      |                  ~^~~~
t.c:24:46: warning: iteration 98 invokes undefined behavior [-Waggressive-loop-optimizations]
   24 |             T[i+1][j] = (dt/pow(dz, 2))*(T[i][j+1] - 2*T[i][j] + T[i][j-1]) + dt + T[i][j];
      |                                          ~~~~^~~~~
t.c:23:19: note: within this loop
   23 |         for (j=1;j<N;j++){
      |                   ^
t.c:20:18: warning: iteration 99 invokes undefined behavior [-Waggressive-loop-optimizations]
   20 |         T[0][j+1]=b;
      |         ~~~~~~~~~^~
t.c:19:15: note: within this loop
   19 |     for (j=0;j<N+1;j++){
      |              ~^~~~
t.c:15:16: warning: iteration 101 invokes undefined behavior [-Waggressive-loop-optimizations]
   15 |         T[i][0]=b;
      |         ~~~~~~~^~
t.c:14:15: note: within this loop
   14 |     for (i=0;i<N+2;i++){
      |              ~^~~~
票数 0
EN

Stack Overflow用户

发布于 2022-11-16 12:38:43

正如vm666所指出的,编译器注意到循环读取过数组T的末尾,这是未定义的行为。编译器可以以未定义的行为执行任何操作。在这种情况下--在循环的某个迭代中--编译器可能假设迭代101从未发生。这是对未定义行为的一种允许的解释,因为它(令人惊讶)通常是正确的。然后,编译器可以推断,如果迭代101从未发生,某种神奇的力量(比如调用exit)必须在迭代101之前停止循环,所以它永远不能超过迭代101,所以它不需要检查它是否超过了迭代101,而且如果程序从未真正检查并且循环是无限的,那么程序可能会更快一些。

狡猾的编译器。

如果这是实际原因,您可以通过不从数组外部打印数字来修复它。您似乎意外地在ij循环中添加了另一个+1,所以只需再次取消它。

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

https://stackoverflow.com/questions/74460207

复制
相关文章

相似问题

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