• ベストアンサー

3次式「aX^3+bX^2+cX+d=0」の一般解(実数で)を誘導したいのですが,どうすればよいのでしょうか?

当方,応力の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法やヤコビ法などのような収束計算を用いる方法は,計算コストの関係上あまり使用したくないと考えております. ご教授の程,よろしくお願いいたします.

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

  • ベストアンサー
  • alice_38
  • ベストアンサー率43% (75/172)
回答No.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 も計算できる。 途中、平方根と三乗根を使うから、計算機の上では やはり収束計算が必要になってしまうけれども。

diyondiyon
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

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

それはカルダノの方法ですね. 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 でも「実際に「計算」した結果がどうであるのかを見せてもらえませんか」と一応書いておいたんだけどねぇ....

diyondiyon
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

diyondiyon
質問者

補足

迅速なご回答ありがとうございます.たいへん参考になります. お言葉に甘えて,もう少し質問してもよろしいでしょうか? 「解の公式」はカルダノの方法だと思います.一応,参照したURLを記します. http://yosshy.sansu.org/3jieq.htm http://www.gifu-nct.ac.jp/sizen/okada/3eq/3eq.pdf#search='3次方程式%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に原因があるのではないかと考えております.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • xについての方程式x^3+ax^2+bx+8=0が3つの実数解α,β,

    xについての方程式x^3+ax^2+bx+8=0が3つの実数解α,β,γ(α<β<γ)を持ち、それらがある順序で等比数列をなし、また、ある順序で等差数列をなす。このとき、定数a,bおよびα,β,γの値を求めよ。 解答には、α<β<γよりα,β,γの順に並んでいる。      等差数列だから2β=αγ,等比数列だからb^2=acとなる。      等差数列の考えはこれで良いが、等比の場合b^2=acとa^2=bcとc^2=abという3通りを考えなけ     ればならないみたいです。      これと、解と係数の関係よりα+β+γ=-a                   αβ+βγ+γα=b                    αβγ=-8を使って解くみたいなんですが、こっから代入しまくるら     しいんですが、どうに始めて最後まで解けばいいかわかりません。      わかる方いましたら、ぜひ教えてください!!お願いします!! 

  • 実数解

    3つの2次方程式は少なくとも1つは実数解を持つことを示す問題です。 だたし、a,b,cは実数とします。 (x^2)+3ax+2b-1=0 …(1) (x^2)+2bx+2c-1=0 …(2) (x^2)+2cx+2a-1=0 …(3) (1)の判別式は D/4=(a^2)-2b+1 (2)の判別式は D/4=(b^2)-2c+1 (3)の判別式は D/4=(c^2)-2a+1 となりましたがどのようにして少なくとも1つは実数解ということを探すのでしょうか?

  • ax^2+bx+c=0の解を求めたいのですが・・(初歩的です)

    タイトル通り、a、b、cを入力させて、ax^2+bx+c=0の解xを求めたいのですが、結果をどう求めればいいのか、実解・虚数解・重解の場合をどうしたらいいのか、の2点がよくわかりません。 #include<math.h> #include<stdio.h> double sqrt(double a,double b,double c) { return (b*b-4*a*c); } main(void) { double a,b,c,sqrt,ans; do{ printf("ax^2 + bx +c = 0 の解 x を求めます。\n a,b,cを入力してください。\n"); printf("a : "); scanf("%lf",&a); printf("\nb : "); scanf("%lf",&b); printf("\nc : "); scanf("%lf",&c); if(a = 0){ printf("a は0以外を入力してください。\n"); } }while(a = 0); ans = (-b+dist(a,b,c))/(2*a); printf("%lf", ans); printf("\n"); return(0); } 他にも多々ダメな部分があると思いますがご指摘・アドバイス等いただけたらと思います。よろしくお願いします。

  • 2次方程式の実数解の符号

    2次方程式a+x2(←二乗)+bx+c=0の2つの解α,βと判別式Dについて、 α,βは異なる2つの正の解⇔D>0でα+β>0かつαβ>0 α,βは異なる2つの負の解⇔D>0でα+β<0かつαβ>0 α,βは符号の異なる解⇔αβ<0 となるとき、なぜ2つともD>0となるのか分かりません。 あと、α,βは符号の異なる解の時D>0を書かないのはなぜですか?分かる方、宜しくお願いします(;_;)

  • D<0とax^2+bx+c=0について

    , y=ax^2+bx+cの頂点が(-b/2a,-D/4a)よりD<0の場合ax^2+bx+c=0(a≠0)にはなりませんが x=(-b±√D)/2aがD<0となるとxが虚数となるので、ax^2+bx+c=0にならないという解釈でもよいでしょうか?後、x軸、y軸上に取るものはすべて実数で虚数ということはx軸上に存在しないということですよね?

  • 3次方程式の実数解の個数のプログラムについて…

    C++で、3次方程式の実数解の個数を調べるプログラムを作ってみた(↓)のですが、実行したときに問題点があって困っています。 #include<stdio.h> #include<math.h> void main(void) /*3次方程式の実数解の個数*/ { double a,b,c,d,D,A,B; printf("f(x)=a*pow(x,3)+b*pow(x,2)+c*x+d=0 に対して、a,b,c,dの値を定めると、\n"); scanf("%lf %lf %lf %lf",&a,&b,&c,&d); D=4*pow(b,2)-12*a*c; A=(-b+sqrt(b*b-3*a*c))/(3*a); B=(-b-sqrt(b*b-3*a*c))/(3*a); if(a>0) if(D<=0 || (D>0 && A>0) || (D>0 && B<0)) printf("実数解の個数は1個\n"); else if(A<0 && B>0) printf("実数解の個数は3個\n"); else printf("実数解の個数は2個\n"); else a=-a; b=-b; c=-c; d=-d; if(D<=0 || (D>0 && A>0) || (D>0 && B<0)) printf("実数解の個数は1個\n"); else if(A<0 && B>0) printf("実数解の個数は3個\n"); else printf("実数解の個数は2個\n"); その問題点というのは、実数解の個数が2個と3個のときは、実行したときの結果として、 実数解の個数は2個 Press any key to continue あるいは 実数解の個数は3個 Press any key to continue と正しく表示されるのですが、実数解の個数が1個のときは、 実数解の個数は1個 実数解の個数は1個 Press any key to continue と「実数解の個数は1個」が2回表示されてしまうのです。 なぜ、2回表示されるのか分かりません。 初心者なので、できるだけ詳しい解決法などよろしくお願い致します。

  • 実数解を持つ条件

    a,bはa≠bを満たす実数である。 x^2-(a+b)x+ab-a+b=0 が2つの実数解を持つ条件をab平面上に図示せよ。 判別式Dを使って、式を整理すると D=(a-b)(a-b+4)>0 となったのですが、その後がわかりません。 これらをどのようにab平面に図示すればいいのでしょうか? アドバイスをください。お願いします。

  • 四次方程式 解の公式 一般解

    こんにちは。 弱塩基と強酸の中和滴定をシミュレートをして[OH-]の濃度と滴定量のグラフを書かせたいと思っています。そのためには4次方程式の解を求めなければならないらしいのです。HP等で検索するといろいろ解法(四次方程式の)が載っているのですが私には難しすぎてなかなか理解できません。たれか助けてください。欲しい回答は 四次方程式 X^4+a*X^3+b*X^2+c*X+d=0の一般解です。 できれば二次方程式の解の公式のような明解な一般解の形で示していただけるとありがたいです。上式に使っているa,b,c,dだけであらわした一般解がいいです。 以上どなたか答えてください。

  • 微分方程式の一般解

    微分方程式の一般解を求める問題なのですが、どうしてもよく分かりません。 y'6+4y'2=40x^3  (ここで'○は微分の回数を示すとします。また、以下ではD=d/dxのことです) 同時方程式(D^6+4D^2)y=D^2(D^4+4)y=D^2{(D^2+2)^2-4D^2}y=D^2(D^2+2+2D)(D^2+2-2D)y=D^2{(D+1)^2+1}{(D-1)^2+1}y=0 の基本解は{1、x、e^(-x)cosx、e^(-x)sinx、e^xcosx、e^xsinx} 次に特殊解Y(x)を求める。 非同次項R(x)=40x^3は同時方程式40D^4y=0の解だから、 特殊解Y(x)の式Yは同時方程式 40D^4・D^2{(D+1)^2+1}{(D-1)^2+1}y=0の解である。 この基本解{1、x、x^2、x^3、x^4、x^5、e^(-x)cosx、e^(-x)sinx、e^xcosx、e^xsinx}から与式の基本解を除いたx^2、x^3、x^4、x^5の一次結合として Y(x)=Ax^2+Bx^+Cx^4+Dx^5とおく。 与式の左辺に代入… と続いていくのですが、どうにもしっくりきません。 答えも y=(20/3)x^3+c1+c2x+e^(x/√2){c3cos(x/√2)+c4sin(x/√2)}+e^(-x/√2){c5cos(x/√2)+c6sin(x/√2)} となり、私の解からでは到底結びつくとは思えないです。 気になるのが 「非同次項R(x)=40x^3は同時方程式40D^4y=0の解だから」 としていますが、本当にこれで良いのか自信もありません。 もし間違えていたら解説をお願いします。 また、他に違うというようなところがあったら指摘してください。 回答、よろしくお願いします。

  • 虚数、実数、ax^2+bx+c=0について

    実数とは有理数と無理数をあわせた数であるから x軸、y軸上に取るものはすべて実数で虚数ということはx、y軸上に存在しませんよね? 後、ax^2+bx+c=0(a≠0)において x=(-b±√D)/2aがD<0となるとxが虚数となるので,虚数はx軸に存在しないので、x軸との共有点がなくax^2+bx+c=0となるxはないという解釈でだいじょうぶでしょうか?