dポイントプレゼントキャンペーン実施中!

三次方程式の解を求める方法を探しているのですが、
カルダノの公式だと解が実数解の場合にも、虚数解がでてしまうらしいので、カルダノの公式以外で実数解を求める方法はないのでしょうか?(実数解のみを持つ方程式でカルダノの公式を用いると実数解と虚数解で解が5つでるということがよくわかりませんが・・・)
 自分はC言語でプログラムをしたいので、高校数学のように最初一つは適当に代入するという方法は使いたくありません。
よろしくお願いします。

A 回答 (5件)

Cでプログラムかくなら、係数を引数として解を戻り値とする関数をmain関数の外枠に書いちゃえば、プログラムが長いかどうかは問題ではないでしょう。



で、3次方程式をプログラムで解くのに、カルダノの公式以外のものを使いたいなら、#1さんも言っているニュートン法はだめなのでしょうか?
[為念ですが、f(x)=0の解を、x(n+1) = x(n) - f(x(n))/f'(x(n))という反復公式で求める手法です。]

プログラムは間違いなくシンプルでしょうし、3次方程式程度であれば、初期点を妥当な選び方してあげれば数回の反復で充分な精度の解が得られるでしょうから、案外カルダノの公式でごつい計算するより速いかもしれません。

ところで、3次方程式の実数解は、(重解は複数回数えると)1つor3つありますが、3つある場合、特定(たとえば最小)の解を求めたいのか、任意の1つでよいのか、それとも3つとも求めたいのか、どれなんでしょう?
それによって、ちょっと初期点の選び方の「まじめさ」が変わってくるでしょうね。
    • good
    • 0
この回答へのお礼

返事が遅れてもうしわけありません
回答ありがとうございます
とりあえず,Newton法でプログラム作ってみました。
求めたい解ですが,3つ全部求めたいです。
たしかに,その場合,どう初期値を選べばよいか
わからないです

お礼日時:2005/06/15 18:10

3つともの解を求めたいなら、


f'(x)=0の解をα, β(α<β)としたときに、
α-1, (α+β)/2, β+1
のそれぞれを初期点とすればよいと思います。
    • good
    • 0
この回答へのお礼

またまた、返事が遅れて申しわけございません
プログラムができました
どうもありがとうございました

お礼日時:2005/06/26 00:18

あまり数学的な回答でありませんが、C言語でプログラムしちゃうということなので。

計算機ならありでしょ、という案です。

1. まず3次方程式をf(x)=ax^3+bx^2+c^x+d とおきます。1階微分 f(x)'、2階微分 f(x)'' はすぐ出ますね。

2. f(x)'=0, f(x)''=0 からf(x)の極大、極小の2点を作るxがわかります。極大、極小となる点のうちxの値が小さいほうとりあえず x_p1、大きいほうを x_p2 とすると、x_p1, x_p2 の値の0、正、負で3次方程式の解がいくつあるか判別できますね。

3. 計算機に計算させる上では無限大はありえないので、仕様上 x には、最小値、最大値がひつようになります。これをとりあえず x_p0、x_p3 とおきます。

4. x_p1, x_p2 の値の0、正、負で[p0,p1],[p1,p2],[p2,p3]のどの区間にf(x)=0となる解が存在するかわかりますから、3つの区間に分けて許容計算誤差に収まるまで2分探索でもニュートン法でも何でも良いので探索します。

以上、投稿された質問の文面から、質問者さんが大学生以上である程度計算機に慣れた方であることを想定して回答させていただきました。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
この方法だと繰り返し計算に時間がかかると思って
一発ででる方法を探していたんですよ。
長いプログラムに加える予定なので

お礼日時:2005/06/10 22:49

誤解されていませんか。



カルダノの公式では、解を求める過程で虚数を経由する場合がありますが、実数解はちゃんと実数として出てきます。

>>実数解のみを持つ方程式でカルダノの公式を用いると実数解と虚数解で解が5つでる

そんなことはあり得ません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
誤解してたみたいです。
自分でどう計算してもiが消えなくて、
ネットで探しているときに、じ¥このような文章を見たもので・・・

お礼日時:2005/06/10 22:44

普通3次方程式を計算機で解くのにカルダノの公式は使わないんですが (ニュートン法使うのが簡単?), 使えないわけではないです.


カルダノの公式を使うと 3つの異なる実解を持つときに複素数の 3乗根を求めないといけないのですが, 人手ならいざしらず計算機なら複素数の 3乗根は計算できちゃうので. たとえば a + ib の 3乗根は r = sqrt(a^2+b^2), th = atan2(b, a) に対して pow(r, 1.0/3) * [cos(th/3) + i sin(th/3)] で計算できます.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
この方法なら、カルダノの公式を使ったプログラムできそうですね
考えてみます。

お礼日時:2005/06/10 22:42

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