タイトルにもある通り2次方程式の解の求め方がわかりません。
よろしくお願いします。
えーと、数学の質問ですか。
因数分解とかするんでは? パソコンで数値解を求めるなら根の公式をつかってください。
ミュータントさんの言うように、公式をそのまま使えばよろしいかと。
平方根は、sqrt関数を使用します。
複素数を考慮するのであれば、VarCmplxユニットをusesに加えてVarComplexSqrtを使用します。
この場合は、値はExtendedでなく、Variant型です。値もVarComplexCreate関数を使って生成する必要があります。
# VarComplexCreateを使わずに、Variantから直接作ってもいいんですが。
普通にルートの中の正負を判断して、場合わけして絶対値で求めると簡単なんでは > 複素数
編集 削除要はやり方の問題かと思います。
判断があるということは分岐がある=複雑化する、だと思います。
複素数ユニットを使えば、判断は不要です。
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);
というように出来ますし。
中身のしれないユニットを使うことが複雑化と考えるのであれば、正負の判断でやるほうがより簡潔ですね。
> 中身のしれないユニットを使うことが複雑化と考えるのであれば
そう。どうせ宿題なんだかろ、ややこしいライブラリで解決するより、論理で解決
すべきだと思うんですが。
すみません追加で聞きたいんですが
複素数のデータを持つ配列を作成するときはどうしたらいいんでしょうか?
やり方にもよります。
にしのさんご指摘の VarCmplx ユニットをつかって variant で配列をつくるのも
ありますし、複素数をレコード型にして扱うのもあります。
http://www.ibrtses.com/delphi/complexrec.html
varCmplxは割り算の分母の絶対値が1E-6程度に小さくなると、「ゼロによる除算」エラーが出ます。また、絶対値の小さな変数に対しては、関数の精度も落ちるようです。複雑な計算で、計算の途中で変数の絶対値が小さくなる場合は問題になると思います。本来技術計算用のユニットなので、このような制限があるのはおかしいでしょう。私は、問題の箇所を修正した別ユニットを作って計算に使っています。
編集 削除りおりおさん、おやじさん解答ありがとうございます。
>varCmplxは割り算の分母の絶対値が1E-6程度に小さくなるとエラー
1E-6程度で除算エラーって何なんでしょうね。FFTのプログラムつくろうとしてたんでちょっとまずいですね。
りおりおさんのいうようにレコード型にして自分で関数つくってやった方が良さそうですね