プロが教えるわが家の防犯対策術!

当方,応力の6成分を用いて,主応力成分を3つ求めたいと考えております.
3×3行列を対角化する演算を行うことになると考え,計算するうちに3次式を解く必要が出てまいりました.

3次式の解の公式を試しておりまして,
「a=1, b=-6, c=11 d=-6 → (x-1)(x-2)(x-3)=0を想定」の解は,理論どおりx=1,2,3と計算できたのですが,
「a=1, b=-13, c=47 d=-35 → (x-1)(x-5)(x-7)=0を想定」の解は,理論どおりのx=1,5,7とは,うまく計算できておりません.

また,最終的にはプログラムを構築する予定ですが,
Newton法やヤコビ法などのような収束計算を用いる方法は,計算コストの関係上あまり使用したくないと考えております.

ご教授の程,よろしくお願いいたします.

A 回答 (3件)

双曲線関数を使ったアルゴリズム:


a X^3 + b X^2 + c X + d = 0 を Y = X + b/(3a) で置換すると、
4 Y^3 + p Y + q = 0 (p,q は定数) という形に変形できる。
更に Y = R sinh Z で置換すると、三倍角公式を使って
sinh(3Z) + q/R^3 = { 3 - p/R^2 }(sinh Z) と変形される。
3 - p/R^2 = 0 となるように R を定めれば、
sinh(3Z) = -q/R^3 となる。
ここで、sinh の逆関数を使って 3Z を求め、
sinh Z から X へとたどるのでは、超越的な計算になってしまう。
sinh z = (e^z - e^-z)/2 により、sinh(3Z) = -q/R^3 を
e^(3Z) に関する二次方程式と考えると、代数的計算だけで
e^(3Z) が求まる。実数の三乗根をとれば e^Z が得られるので、
sinh Z も計算できる。
途中、平方根と三乗根を使うから、計算機の上では
やはり収束計算が必要になってしまうけれども。
    • good
    • 0
この回答へのお礼

ご回答,ありがとうございました.
試してみようと思います.

お礼日時:2009/12/24 11:50

それはカルダノの方法ですね.


1点指摘させてもらうと, 「3つの異なる実解が得られるとき」には「複素数」になるはずです. 「虚数」と「複素数」は同じ意味で使うこともありますが違う意味で使うこともあるので気をつけてください. 実際, 「実数+虚数」と書かれていますがこの「虚数」を「複素数」と解釈すると意味が分からないです (わざわざ実数を加える意味がない).
で「なぜ複素数になるのか」ですが, これはいくつかの説明が考えられます. 一番手を抜くと
・もとの 3次方程式の判別式 D が得られた 2次の分解方程式を解くときに √(-D) の形で入るから
という説明になります. もうちょっと詳しく言うと, カルダノの方法は与えられた 3次方程式を
x^3 + ax + b = 0 …(1)
という形に整理してから x = u + v とおいて誘導されます. 分解方程式は u^3, v^3 を解に持つのですが, このとき uv が (元の方程式が実係数なら実の) 定数とならなければなりません. ということで, (1) の解 x は分解方程式の解である u^3, v^3 から
x = u+v, uω+vω^2, uω^2+vω
で得られます. ここで
・u = v のとき: (1) は (実の) 重解をもつ (u = v = 0 なら 3重解, そうでなければ単解+2重解)
・u ≠ v のとき: (1) は重解をもたない
とまずわかれ, 後者はさらに
・u, v が異なる実数: u+v は実数だが残り 2つは複素数解
・u, v が (異なる) 複素数: 3つ全てが実数かつ (u = α+iβ, v = α-iβ とおけばわかるように) その 3つはすべて異なる
と分かれることが確認できます (確かめてみてください).
要するに, (疑問1) は「公式の誘導をしっかり確かめれば容易に確認できる」ことです.
ついでですが, 「理論通りに計算できていない」とだけ言われても困るので, 「どのような結果になっているのか」を必ず載せてください. #1 でも「実際に「計算」した結果がどうであるのかを見せてもらえませんか」と一応書いておいたんだけどねぇ....
    • good
    • 0
この回答へのお礼

ご指摘,ありがとうございます.

お礼日時:2009/12/24 11:52

その「解の公式」がどういうものか, そして実際に「計算」した結果がどうであるのかを見せてもらえませんか?


「カルダノの方法」で 3つの異なる実解が得られるときには「複素数の 3乗根」が必要なんだけど, そこではまってる?
もしそうでかつ「最終的にはプログラムを構築する」というなら, 三角関数や逆三角関数を使った形で書いた方が簡単だと思うよ.

この回答への補足

迅速なご回答ありがとうございます.たいへん参考になります.
お言葉に甘えて,もう少し質問してもよろしいでしょうか?

「解の公式」はカルダノの方法だと思います.一応,参照したURLを記します.
http://yosshy.sansu.org/3jieq.htm
http://www.gifu-nct.ac.jp/sizen/okada/3eq/3eq.pd …次方程式%20一般解'

ここで,「複素数の 3乗根」の算出方法は理解できているのですが,「なぜ,3つの異なる実解が得られるときには虚数でなければならないのか」が理解できておりません.「実数のみ」や「実数+虚数」の解ではダメなのか,理解できておりません(疑問1).

とりあえず,疑問1を真として,上述の誘導をもとにプログラムを作成しており,「a=1, b=-6, c=11 d=-6 → (x-1)(x-2)(x-3)=0を想定」の解は,理論どおりx=1,2,3と計算できました.しかし,「a=1, b=-13, c=47 d=-35 → (x-1)(x-5)(x-7)=0を想定」や,「a=1, b=-2, c=-1 d=2 → (x+1)(x-1)(x-2)=0を想定」は理論どおり計算できておりません(疑問2).おそらく,疑問1に原因があるのではないかと考えております.

補足日時:2009/12/22 13:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!