質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1634閲覧

陰解法による数値計算について(1次元拡散方程式)

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/16 02:53

前提・実現したいこと

1次元拡散方程式を陰解法で解く。

該当のソースコード

python

1import numpy as np 2from matplotlib import pyplot as plt 3from matplotlib import animation as animation 4from pylab import * 5 6 7class Base: 8 def __init__(self, fig, dt, nx, dx): 9 self.dt = float(dt) 10 self.nx = int(nx) 11 self.dx = float(dx) 12 self.dx2 = self.dx * self.dx 13 self.count = 0 14 self.data = np.zeros([self.nx]) 15 self.ax = fig.add_subplot(111) 16 def step(self, frame, params): 17 self.count = self.count + 1 18 print(self.count) 19 self.ax.clear() 20 self.ax.grid() 21 data_old = np.copy(self.data) 22 if frame > 0: 23 self.calculation(data_old) 24 self.ax.plot([float(n) * self.dx for n in range(self.nx)], self.data) 25 self.ax.set_xlim(self.xlim) 26 self.ax.set_ylim(self.ylim) 27 self.ax.set_title("t=%.1f" % (float(self.count)*self.dt)) 28 def prepare(self): 29 self.prepareData() 30 self.xlim = (0, float(self.nx)*self.dx) 31 self.ylim = (0, np.amax(self.data)*1.2) 32 33class Sim (Base): 34 def __init__(self, fig, dt, nx, dx, u, a): 35 super().__init__(fig, dt, nx, dx) 36 self.u = float(u) 37 self.a = float(a) 38 def prepareData(self): 39 self.data = np.full(self.nx, 0.0) 40 self.data[4] = 1.0 41 self.data[5] = 1.0 42 self.count = 0 43 def calculation(self, data_old): 44 A = np.zeros((self.nx+1,self.nx+1)) 45 F = (self.a * self.dt / self.dx2) 46 A[0,0] = A[10,10] = 2 * F + 1 47 A[0,1] = A[10,9] = -F 48 for i in range(1, self.nx): 49 if i >= 1 and i < self.nx: 50 A[i,i] = 2 * F + 1 51 A[i,i+1] = A[i,i-1] = -F 52 53 b = np.zeros(self.nx+1) 54 for ix in range(1,self.nx-1): 55 b[ix] = F * data_old[ix+1] + (1-2*F) * data_old[ix] +F * data_old[ix-1] 56 57 u = np.zeros(self.nx+1) 58 u[0] =u[10] = 0 59 u =np.linalg.solve(A,b) 60 61 pass 62 self.data[0] = self.data[1] 63 self.data[self.nx-1] = self.data[self.nx-2] 64 65 66 67def main(): 68 fig = plt.figure() 69 sim = Sim(fig, dt= .1, nx = 10, dx = 1.0, u = 1., a = 1.) 70 ani = animation.FuncAnimation(fig, sim.step, 71 init_func=sim.prepare, 72 frames=range(100), 73 fargs=[sim], 74 blit=False, repeat=False, interval=50) 75 plt.show() 76 77if __name__ == "__main__": 78 main()

試したこと

1次元拡散方程式を陰解法で解こうとしていますが、プログラムでうまく表現できず困っております。
下記ホームページなどを参考にして調べてみたものの、上手く行きませんでした。
https://hplgit.github.io/fdm-book/doc/pub/book/sphinx/._book011.html

初学者のため、基本的なミスや理解の及ばない点があるのは重々承知しておりますが、アドバイス頂けましたら幸いです。

どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんばんわ。

ぱっと見で気になるのは、

u =np.linalg.solve(A,b)

連立一次方程式を解いたあと、uの内容でself.dataが更新されていないことですね。

self.dataが初期値のままになってるんじゃないでしょうか。

投稿2021/08/16 09:49

srsnsts

総合スコア480

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/08/17 22:38

どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問