個人事業主の方必見!確定申告のお悩み解決

x^3-15x-4=0をカルダノの公式を用いて解こうとしても還元不能に陥り、x=4、-2±√3は求まりませんが、ビエタの解を用いると、x=4は求まります(関数電卓でarccosを使用した場合)。ビエタの解を用いて、x=-2±√3はどのように求めるのか、具体的な式を教えて下さい。又、ラグランジュの方法を用いて解く場合の具体的な導出も教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

還元不能の場合も、単に虚数が出てくるだけで、


カルダノ法も、ラグランジュ法も、普通に遂行できる。
三実根を持つ三次方程式を扱う場面は多いだろうから、
虚数を嫌わないほうがよかろうということ。
    • good
    • 1

ピエタの解法を行うときに、関数電卓で arccos を使ったのでは、


x = 4 ではなく、x ≒ 4 としか言えません。それをヒントに
原式へ x = 4 を代入してみて、発見的に解 4 を見つけるなら
構わないとは思いますが。

カルダノの解法とラグランジュの解法では、途中の説明は異なりますが、
登場する二次の補助方程式は共通です。だから、還元不能の場合は
共通になります。三次方程式に三実根があることと、還元不能が同値
なので、還元不能では驚かないほうがよいです。

この回答への補足

どうもありがとうございました。
ところで、3次方程式に3実根があることと、還元不能が同値なのは何故でしょうか?
ということは、「3実根がある3次方程式は、カルダノの公式とラグランジュの解法では解けない」という理解でよいのでしょうか?

補足日時:2011/12/21 13:00
    • good
    • 2

(1)カルダノの公式で還元不能となった場合、ラグランジュの方程式で還元不能を回避出来ないのは何故でしょうか?


http://ja.wikipedia.org/wiki/%E4%B8%89%E6%AC%A1% …
に書いてある文字を使えばx^3-15x-4=0の場合
A0=-4
A1=-15
A2=0
です。ここでs1^3とs2^3を解とする2次方程式は
z^2-108z+45^3=0
となるので
z=54±√(54^2-45^3)
これを
z/27=2±√(2^2-5^3)
とみればカルダノの公式とまったく同じになることがわかるだろう。

(2)カルダノの公式で還元不能となったので、ビエタの解で解こうとしましたが、arccosの変数が1を超えた為これも還元不能となりました。

単なる計算間違いでしょう。なりません。
    • good
    • 3

ビエタの解


x^3-15x-4=0を例にすると,x^3=3*(√5)^2*x+(√5)^2*(4/5)と変形できるから
t1=1/3*arccos((4/5)/(2*√5))を計算する。
t1=0.463647609
t2=t1+(2/3)πとt3=t1+(4/3)πを計算する。
t2=2.558042711
t3=4.652437814
ここから
x1=2*√5*cos(t1)=4
x2=2*√5*cos(t2)=-3.732050808=-2-√3
x3=2*√5*cos(t3)=-0.267949192=-2+√3

カルダノの公式で還元不能となった場合、ラグランジュの方程式で還元不能を回避することはできません。

この回答への補足

どうもありがとうございました。もし、可能であれば、あと2点ほど質問させて下さい。

(1)カルダノの公式で還元不能となった場合、ラグランジュの方程式で還元不能を回避出来ないのは何故でしょうか?今回の3次方程式の場合、ビエタの解では、回避出来ていますが・・・。

(2)実対称行列は3個の実数の固有値を持ちますが、ある実対称行列の固有値を求める過程で、カルダノの公式で還元不能となったので、ビエタの解で解こうとしましたが、arccosの変数が1を超えた為これも還元不能となりました。カルダノの公式で還元不能である場合、ラグランジュの方程式でも還元不能を回避出来ないとなると、エクセルのソルバーなどで強引に解く以外方法は無いのでしょうか?

補足日時:2011/12/20 13:01
    • good
    • 0

カルダノの公式では「還元不能」という表現をするけど, ラグランジュの方法では使うのかなぁ? 一応, ラグランジュの方法における「還元不能」の意味を与えておいた方がいいと思う. あと, その意味の下であなたがどこまで処理してどこで困ったのかがあると説明しやすいかもしれない.



ちなみに「ビエタの解」というのは, 要するに
与えられた θ に対して cos θ = cos 3α であるような α を求める
ことに帰着されるわけだから, 今の場合でも 3つの α を使えばそれぞれが得られるはず.
    • good
    • 0

×開 ○解


でした。失礼。
    • good
    • 0

難しく考えずに因数分解



(x-4)(x^2+4x+1)=0

して、二次方程式の開の公式を使えばいいのでは?

この回答への補足

因数分解できることは分かっていて敢えて質問させて頂いています。
検証しやすいように、分かりやすい3次方程式を例に出しただけです。教えて頂きたいのは、カルダノの公式で還元不能となった場合、ラグランジュの方程式で還元不能を回避して解を求めることができるかという点です。可能なのであれば、今回の単純な3次方程式で具体的な導出過程を教えて頂き度いというものです。また、今回例示させて頂いた3次方程式をビエタノの解で求める導出過程も教えて頂き度いというものです。よろしくお願いします。

補足日時:2011/12/20 09:06
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q三次方程式の解法について

三次方程式を解くプログラムを作成したいです。
三次方程式a*x3+b*x2+c*x+d=0を解くのに,
カルダノの公式がありますが,解が全て実数解であるとしても,
計算過程で虚数が存在することを考えなければなりません。

しかし,a=1で解が実数解の場合,
計算過程で虚数を考えなくても,簡単に実数解を求める
ことができる(エクセルで簡単に)と聞きました。
ニュートン法等の収束計算を用いる方法ではないようです。

このような方法をご存知でしたら,詳しく教えてください。
よろしくお願いいたします。

Aベストアンサー

ビエタの解
http://ja.wikipedia.org/wiki/%E4%B8%89%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F#.E9.82.84.E5.85.83.E4.B8.8D.E8.83.BD.E3.81.AE.E5.A0.B4.E5.90.88
なら、計算過程で虚数を使わずに実数解が出てきます。

Q3次方程式の求解プログラム(ニュートン法)について!

初心者です!
ニュートン法での3次方程式の求解プログラムを作成しようとしています。
ですがよく分かりません(-_-;)
どなたか教えていただけないでしょうか。。。

Aベストアンサー

プログラム書きました。
これで、どうでしょう?

/* 3次方程式の求解 */
#include<stdio.h>
#include<math.h>
#include<float.h>

#define PI 3.14159265358979323846

#define REAL 0 /* 実根 */
#define IMAGE 1 /* 虚数根 */

int main(void){

double a, b, c, d; /* 3次方程式の係数 */
double p, q;
double D;
double x1, x2, x3; /* 根の実部 */
double y1, y2, y3;
double Im; /* 根の虚部 */
double u, v;
double d_u, d_v;
double phi;

int kind; /* 根の種類: REAL, IMAGE */

// ここから
printf("3次方程式(ax^3+bx^2+cx+d=0)の各係数:\n");
printf("a>>>");
scanf("%lf", &a);
printf("b>>>");
scanf("%lf", &b);
printf("c>>>");
scanf("%lf", &c);
printf("d>>>");
scanf("%lf", &d);

// ここまで消して、a, b, c, d値を代入する式を書いてください。

printf("3次方程式(%gx^3%+gx^2%+gx%+g=0)の解は\n", a, b, c, d );
if( a == 0.0 ){
printf("a(%g)がゼロなので,データエラーとみなし,\n", a );
printf("解を求めずに終了します.\n");
return 1; /* 終了コードを1にして,プログラムを終了 */
}

p = ( 3*a*c - b*b ) / ( 9*a*a );
q = ( 2*b*b*b - 9*a*b*c + 27*a*a*d ) / ( 54*a*a*a );

D = q*q + p*p*p; /* Dには誤差が含まれてしまうことに注意 */

if( fabs(D) <= DBL_EPSILON ){ /* Dを数値的にゼロかどうかチェックする */
/* 3つの重根(2重根・3重根)を含む実根 */
y1 = 2*pow(-q, 1.0/3.0);
y2 = y3 = -y1/2;
kind = REAL;
}else if( D < 0 ){ /* 3つの異なる実根 */
phi = acos( -q / pow( -p*p*p, 1.0/3.0 ) );
y1 = 2*sqrt(-p)*cos(phi/3);
y2 = -2*sqrt(-p)*cos(phi/3+PI/3);
y3 = -2*sqrt(-p)*cos(phi/3-PI/3);
kind = REAL;
}else{ /* 1つの実根,2つの共役複素数の解 */
d_u = -q+sqrt(D);
d_v = -q-sqrt(D);

if( d_u >= 0 ) u = pow( d_u, 1.0/3.0 );
else u = -pow( -d_u, 1.0/3.0 );
if( d_v >= 0 ) v = pow( d_v, 1.0/3.0 );
else v = -pow( -d_v, 1.0/3.0 );
y1 = u+v;
y2 = y3 = -y1/2;
Im = sqrt(3)/2*(u-v);
kind = IMAGE;
}

x1 = y1 - b/(3*a);
x2 = y2 - b/(3*a);
x3 = y3 - b/(3*a);

if( kind == REAL ){
printf("x1=%g, x2=%g, x3=%g\n", x1, x2, x3 );
}else{
printf("x1=%g, x2=(%g + %g i), x3=(%g - %g i)\n",
x1, x2, Im, x3, Im );
}

return 0;
}

プログラム書きました。
これで、どうでしょう?

/* 3次方程式の求解 */
#include<stdio.h>
#include<math.h>
#include<float.h>

#define PI 3.14159265358979323846

#define REAL 0 /* 実根 */
#define IMAGE 1 /* 虚数根 */

int main(void){

double a, b, c, d; /* 3次方程式の係数 */
double p, q;
double D;
double x1, x2, x3; /* 根の実部 */
double y1, y2, y3;
double Im; /* 根の虚部 */
double u, v;
double d_u, d_v;
double phi;

int kind; /* 根の種類: REAL, IMA...続きを読む


人気Q&Aランキング