2次方程式の解を求める方法がわかりません


happy  2004-11-25 20:07:34  No: 11919  IP: [192.*.*.*]

タイトルにもある通り2次方程式の解の求め方がわかりません。
よろしくお願いします。

編集    削除
ミュータント  2004-11-26 00:11:19  No: 11920  IP: [192.*.*.*]

えーと、数学の質問ですか。
因数分解とかするんでは? パソコンで数値解を求めるなら根の公式をつかってください。

編集    削除
にしの  2004-11-26 01:23:16  No: 11921  IP: [192.*.*.*]

ミュータントさんの言うように、公式をそのまま使えばよろしいかと。
平方根は、sqrt関数を使用します。

複素数を考慮するのであれば、VarCmplxユニットをusesに加えてVarComplexSqrtを使用します。
この場合は、値はExtendedでなく、Variant型です。値もVarComplexCreate関数を使って生成する必要があります。
# VarComplexCreateを使わずに、Variantから直接作ってもいいんですが。

編集    削除
ミュータント  2004-11-26 02:52:24  No: 11922  IP: [192.*.*.*]

普通にルートの中の正負を判断して、場合わけして絶対値で求めると簡単なんでは > 複素数

編集    削除
にしの  2004-11-26 03:53:30  No: 11923  IP: [192.*.*.*]

要はやり方の問題かと思います。
判断があるということは分岐がある=複雑化する、だと思います。
複素数ユニットを使えば、判断は不要です。
  varX1 := (-varB - VarComplexSqrt(VarComplexSqr(varB)-4*varA*varC)) / (2*varA);
  varX2 := (-varB + VarComplexSqrt(VarComplexSqr(varB)-4*varA*varC)) / (2*varA);
のみです。

各変数への代入も、
  varA := VarComplexCreate(StrToFloatDef(Edit1.Text, 1.0), 0.0);
というように出来ますし。

中身のしれないユニットを使うことが複雑化と考えるのであれば、正負の判断でやるほうがより簡潔ですね。

編集    削除
ミュータント  2004-11-26 04:41:06  No: 11924  IP: [192.*.*.*]

> 中身のしれないユニットを使うことが複雑化と考えるのであれば

そう。どうせ宿題なんだかろ、ややこしいライブラリで解決するより、論理で解決
すべきだと思うんですが。

編集    削除
zzz  2004-11-28 07:20:56  No: 11925  IP: [192.*.*.*]

すみません追加で聞きたいんですが
複素数のデータを持つ配列を作成するときはどうしたらいいんでしょうか?

編集    削除
りおりお  2004-11-28 20:21:39  No: 11926  IP: [192.*.*.*]

やり方にもよります。

にしのさんご指摘の VarCmplx ユニットをつかって variant で配列をつくるのも
ありますし、複素数をレコード型にして扱うのもあります。

http://www.ibrtses.com/delphi/complexrec.html

編集    削除
おやじ  2004-11-30 01:16:02  No: 11927  IP: [192.*.*.*]

varCmplxは割り算の分母の絶対値が1E-6程度に小さくなると、「ゼロによる除算」エラーが出ます。また、絶対値の小さな変数に対しては、関数の精度も落ちるようです。複雑な計算で、計算の途中で変数の絶対値が小さくなる場合は問題になると思います。本来技術計算用のユニットなので、このような制限があるのはおかしいでしょう。私は、問題の箇所を修正した別ユニットを作って計算に使っています。

編集    削除
zzz  2004-11-30 02:28:57  No: 11928  IP: [192.*.*.*]

りおりおさん、おやじさん解答ありがとうございます。
>varCmplxは割り算の分母の絶対値が1E-6程度に小さくなるとエラー
1E-6程度で除算エラーって何なんでしょうね。FFTのプログラムつくろうとしてたんでちょっとまずいですね。
りおりおさんのいうようにレコード型にして自分で関数つくってやった方が良さそうですね

編集    削除