前提・実現したいこと
初学者です。cを用いて数値計算の勉強をしています。
今回行ったことは一次元の熱伝導のシミュレーションです。
do-while文で繰り返しを行っているのですが,whileに記述している条件を満たさなくなる前に終了することがあります。
具体的に説明しますと500回繰り返してほしいところが94回で終了したりします。大体5回行うと3、4回この現象が起こります。
またこの回数は#defineで定義してるところをmain()のなかで記述したりすることで変わったりします。
このコードで行っている熱伝導の条件を以下に示します。
∂u/∂t = ∂^2u/∂x^2 (0<x<1)
u(x,0) = x (0<=x<=1/2) or 1-x (1/2<x<=1)
u(0,t) = u(1,t) = 0
⊿x = 1/10, ⊿t = 1/500
お手数おかけしますがよろしくお願いいたします。
該当のソースコード
c言語
1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4#include <string.h> 5#include <unistd.h> 6 7#define X 1. 8#define T 1. 9#define N_X 10 10#define N_T 500 11 12int main(){ 13 double u[N_X+1], new_u[N_X+1]; 14 double dx = X / (double)N_X, dt = T / (double)N_T; 15 double a = dt / (dx * dx); 16 double b = 1. - 2. * a; 17 int i, j = 0; 18 double t; 19 20 for(i=0; i<= N_X / 2; i++) u[i] = dx * (double)i; 21 for(i=N_X / 2 + 1; i<=N_X; i++) u[i] = 1. - dx * (double)i; 22 23 new_u[0] = 0.; 24 new_u[N_X] = 0.; 25 26 do{ 27 j++; 28 t = j * dt; 29 30 for(i=1; i<N_X; i++) new_u[i] = a * u[j+1] + b * u[j] + a * u[j - 1]; //問題の箇所 31 for(i=0; i<=N_X; i++) u[i] = new_u[i]; 32 33 if(j%50 == 0) printf("t = %lf u[%d] = %lf\n", t, N_X / 2, u[N_X / 2]); 34 }while(j<N_T); 35 36 return 0; 37}
回答2件
あなたの回答
tips
プレビュー