ラプラス方程式を差分法で解くプログラムについての質問

このQ&Aのポイント
  • ラプラス方程式を差分法で解くプログラムについての質問です。具体的には、プログラムがどの方法を利用してどのように計算しているのか知りたいです。
  • ラプラス方程式の差分法による解き方について調べ、それをもとにプログラムを理解しようとしています。そこで、実際にこのプログラムでは、どのような式を用いて計算しているのか、そしてどの方法を利用しているのか教えてください。
  • ラプラス方程式を差分法で解くプログラムに関して質問があります。具体的には、このプログラムがどのような方法を利用してどのように計算しているのか、そしてどのような式を用いているのか知りたいです。
回答を見る
  • ベストアンサー

http://www.geocities.jp/laprog321/

http://www.geocities.jp/laprog321/ この上記URLのプログラムについて質問です。 このプログラムはラプラス方程式を差分法で解くプログラムと書いていたので、 自分はまずプログラムを理解しようとするために、 インターネットなどで、ラプラス方程式の差分法による解き方についていろいろ調べて、式を考えたりしました。 そして、このプログラムがいう差分法とは中央差分方程式を用いて解いているのかなと思ったのですが、 何卒知識が少ないもので、実際に合ってるかどうかが分かりません。 また、ラプラス方程式をコンピュータに解かせる場合、解き方の反復法として、 いろいろな種類(ガウスザイデル法、ヤコビ法、SOR法など)の方法があることがわかりました。 ここで質問させていただきます。 プログラムでは、実際にどの方法を利用してどのように計算しているのか教えてほしいです。 例えば、ここの部分(行数など)で「~式」、「~法」を用いてどのように計算してるかなど教えてほしいです。 プログラムの流れについては、違う質問でご教授いただいたので、上記した質問のように プログラム本文を使ってではなく、実際にこのプログラムでは、ラプラス方程式をどのような式を用いて、 また、どのような方法で解いているかを、矛盾しているようですが、プログラムと対比して教えていただきたいです。 同じような質問を繰り返し失礼いたします。 文章力のない質問で申し訳ありませんがよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

一般に、Ux(U の x による微分)を、『中心差分近似』すると、 Ux = (u(x+h / 2, y)-u(x-h / 2, y)) / h になり、これを用いて、 Uxx(U の x による2階偏微分)を『中心差分近似』すると、 Uxx = (Ux(x+h / 2, y)-Ux(x-h / 2, y)) / h = (u(x+h / 2+h / 2 , y) / h-u(x+h / 2-h / 2, y) / h) / h (前半分) - (u(x-h / 2+h / 2 , y) / h-u(x-h / 2-h / 2, y) / h) / h (後半分) (前半分) = (u(x+h, y)-u(x, y)) / h^2 (後半分) = (u(x, y)-u(x-h, y)) / h^2 つまり、 Uxx = (u(x+h, y)-u(x, y)) / h^2-(u(x, y)-u(x-h, y)) / h^2 = (u(x+h, y)-2u(x, y)+u(x-h, y)) / h^2 となります。 同様に、 Uyy = (u(x, y+h)-2u(x, y)+u(x, y-h)) / h^2 これを、ラプラス方程式 Uxx+Uyy = 0 に代入して整理すると、 u(x+h, y)-2u(x, y)+u(x-h, y)+(u(x, y+h)-2u(x, y)+u(x, y-h) = 0 u(x+h, y)+u(x-h, y)+u(x, y+h)+u(x, y-h)-4u(x, y) = 0 u(x, y) = (u(x+h, y)+u(x-h, y)+u(x, y+h)+u(x, y-h))/4 h = 1 として、(さらに、x, y を i, j にして)配列で書き直せば、 u[i][j]=(u[i-1][j]+u[i+1][j]+u[i][j-1]+u[i][j+1])/4 各点におけるこの関係を満たすように、u を決定すればいいのですが、この連立方程式を解くのは手間なので、 u(new)[i][j]=(u(old)[i-1][j]+u(old)[i+1][j]+u(old)[i][j-1]+u(old)[i][j+1])/4 の計算を反復させることで近似値を得ます。 この反復計算は、すべての u(new) 算出に、u(old) を使っているので、ヤコビ法によるものになります。 プログラムの中も、これと、ほとんど同じ式なので、どこでやっているかは見当がつくかなと思います。

その他の回答 (2)

回答No.3

あと、どう考えても、初期設定が変というか、不自然なんですね。 ・ラプラス方程式の問題なのに、境界をすべて0にしている。  これだと、計算するまでもなく、U(x, y) = 0 に収束するはず。 ・それを別にしても、sin((j-1)/(SIZE*M_PI)) という式は変。  普通、M_PI (円周率ですよね?)は、(割るのじゃなくて)掛けるはず  もっとも、単純に、sin((j-1)/SIZE*M_P) にすると、int / int  のほうが結合力が強いので、これはこれで、期待しない結果になる。sin(M_P*(j-1)/SIZE) あたりかな? ・そもそも、初期値を設定するのに、(i を使わずに) j だけを使っているのも  ちょっと変な気がする(これは、「ちょっと」程度ですけど) このプログラムの出所が気になるところではあります。  

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「ヤコビ法」とか「ガウス=ザイデル法」, 「SOR法」などがそれぞれどのようなものであるかは理解できていますか? そして, そもそもあなたは何がしたいのですか?

関連するQ&A

  • 偏微分方程式の数値解法

    偏微分方程式の込み入った質問です。 2次元(x,y)の空間で2つの関数f(x,y),g(x,y)を考えます。 そこで、それぞれにラプラス方程式を立てました。 fxx+fyy = 0  (1) gxx+gyy = 0 (2) です。これは境界値問題で、差分式からSOR法を使って収束計算によって数値解を求めることができます。f, gはそれぞれ独立という形にはなります。 そこにもう1つ式が出てきました。 fxfy + gxgy = 0 (3) というものです。f,gをx,yで1回微分してできる式です。 都合3つの式が出てきました。 この数値解を求めるにはどのような方法があるでしょうか。 数値解ですから近似解です。 3つ目の拘束条件の下でのラプラス方程式とみると、ペナルティ関数とかラグランジュの未定係数法とかいろいろあるかもなと思いますが。 3つ目の式は完全に満たすというより、できるだけ満足するようにしたいというものです。 よろしくお願いします。

  • プログラムについて

    プログラムについて 2次元ラプラス方程式を差分法で解くというプログラムなのですが、 ・プログラムの流れ ・具体的に(初期値はいくら、実際の計算、誤差の比較など)どこでどのような計算をしているのか を教えていただけないでしょうか? 面倒だとは思いますがお願いします。 以下プログラムURL http://www.geocities.jp/laprog321/ .

  • ラプラス方程式の解法(情報処理として)と共役勾配法

    情報処理の数学はカテゴリ違いかもしれませんが、適当なところを見出せませんでしたので。 (以下、長文で申し訳ありません。) ラプラス方程式やポアソン方程式の境界値問題を解く方法にSOR法が あります。これは連立一次方程式の反復解法の1つだとも言えると思い ます。連立一次方程式の解法は通常AX=BとなってマトリックスAと既知 ベクトルBに対して未知ベクトルXを解くわけですが、ラプラス方程式 をSOR法で解く場合、AX=Bという形にはしません(そういう風に表現 はできますが)。例えば2次元を考えると100×100の2次元の領域を解く 場合、未知数は10000個です。これをAX=Bという風に考えたら、10000元 連立一次方程式を解くことになり、A(10000,10000)のようにメモリ確保 も大変ですが、実際にはそのように解きませんね。マトリックスAとい うメモリの取り方をしないのです。 100×100の格子領域でSOR法で解くとプログラムステップとしては数十 行ぐらいとなり、大したことはありませんね。 しかし、情報処理の連立一次方程式の解法の本を見ると、それはあくま でも連立1次方程式があった場合ということを前提としているのでその ようなメモリの確保から解説がスタートするようです。 そこで質問ですが、ラプラスやポアソン方程式を(前処理付)共役勾配 法などで解く場合、メモリ確保の前提条件としては連立一次方程式の形 ではないはずです。本を見るとマトリックス解法としての共役勾配法が 出ていますが、ラプラス方程式、ポアソン方程式の特化して解説してい る本などないでしょうか。また、簡単に説明できるのであれば教えて頂 きたいのですが。

  • 2次元ラプラス方程式を差分法で解くというプログラムなのですが、

    2次元ラプラス方程式を差分法で解くというプログラムなのですが、 ・プログラムの流れ ・具体的にどのような計算をしているのか を教えていただけないでしょうか? 面倒だとは思いますがお願いします。 以下プログラムURL http://www.geocities.jp/laprog321/

  • SOR法による差分方程式の解法

    プログラミングのカテゴリーか少し悩んだのですが、 物理関係で差分方程式を解いている人が多いかと思い、 こちらで質問させて頂きます。 解きたいのは、2Dポアソン方程式です。(1Dでも構いません) 微分方程式を差分化してSOR法を使用します。 SOR法は若干ながらメッシュサイズ、加速係数に 解(ポテンシャル形状)が依存します。 しかし、できるだけこういった条件に依存せずに、 正確な解を得たいです。 より安定に正しい(メッシュサイズなどに依存しない)解が得られる 方法など、SOR法について何かご存知の方、何でも構いませんので、 ご教授のほど宜しくお願いします。 又、複雑な構造(ダブルHEMT構造、局所的に高ドープなど)でも、計算を 収束し易くする方法など、何かありましたらアドバイスをお願いします。

  • 連立方程式

    C言語で反復法の「ヤコビ法」と「ガウス・ザイデル法」、消去法を用いて連立方程式を解くプログラムを作りたい。 また、プログラムは任意の元数に対応できるように作りたい。 分かる方がいましたら、回答よろしくお願いします。

  • 差分法の精度(電位の計算)

    よろしくお願いします。 現在、差分法により電位を求めています。 ポアソン方程式を差分化してプログラムにより電位を求め、それと電位の式の計算結果をと比較しているのですが、差分法の計算結果があまり近い値となりません。 差分法の精度とはどのくらいなのでしょうか? 電荷がない場合では完璧に一致するのですが、電荷があると一致しません。ポアソン方程式の一般的な解はまだ導き出されておらず、電荷も常に一定ではないので十分な精度はない、みたいなことをちらっと聞いたこともあるので、もしやと思ったのですが、そもそも差分法の電位の計算とは一致しないものなのでしょうか? よろしくお願いします。

  • プログラムの説明

    プログラムの説明 今回教えていただきたいプログラムは、 2次元ラプラス方程式を差分方程式で解くサンプルプログラムなのですが、 この文章の説明の意味もプログラムについてもほとんど理解できません。 ・2次元ラプラス方程式を差分方程式で解くプログラムとは一体どのようなものなのか、 ・プログラムの流れ、 ・プログラムでは具体的にどのような計算、動作をしているのか、 これらを教えていただきたいです。 めんどうだとは思いますがお願いします。 以下プログラムですが、文字数をオーバーしてしまうため、 半分ずつ貼り付けておきます。 お手数ですが、前半部、後半部をワードパットに貼り付けるなりして、見ていただけると幸いです。 前半部 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1035245510 後半部 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1235245557

  • DSP:伝達関数H(z)を求める目的は?

    差分方程式だけ立てればScilab上で、 伝達関数H(z)を使わず、差分方程式だけで 信号処理プログラムが書けるがわかりました。 なのに何故にZ変換で伝達関数H(z)を求める 必要があるのでしょうか? 今書いているプログラムではScilab上で、 伝達関数の式は出てこず、差分方程式だけ 使っています。 利得の式や周波数特性の式を計算するのに 伝達関数H(z)が必要ということですか?

  • 連立方程式の解法

    連立方程式: Ax=B (A;係数行列、x;未知数、B;右辺行列) において detA = 0 であった場合、この解は一義的には定まらない という事なのですが、 このことはSOR法などの反復法も 使えないと言うこと言ってるのですか? detA = 0 の連立方程式はどうしても解けないのですか?

専門家に質問してみよう