3

2 次方程式の実根を解く、非常に単純でありながら、完全に機能し、非常に役立つ WinForms C# アプリケーションを作成しました。

これが私の現在のプログラミングロジックです:

   string noDivideByZero = "Enter an a value that isn't 0";
    txtSolution1.Text = noDivideByZero;
    txtSolution2.Text = noDivideByZero;

    decimal aValue = nmcA.Value;
    decimal bValue = nmcB.Value;
    decimal cValue = nmcC.Value;

    decimal solution1, solution2;
    string solution1String, solution2String;

    //Quadratic Formula: x = (-b +- sqrt(b^2 - 4ac)) / 2a

    //Calculate discriminant
    decimal insideSquareRoot = (bValue * bValue) - 4 * aValue * cValue;

    if (insideSquareRoot < 0)
    {
        //No real solution
        solution1String = "No real solutions!";
        solution2String = "No real solutions!";

        txtSolution1.Text = solution1String;
        txtSolution2.Text = solution2String;
    }
    else if (insideSquareRoot == 0)
    {
        //One real solution
        decimal sqrtOneSolution = (decimal)Math.Sqrt((double)insideSquareRoot);
        solution1 = (-bValue + sqrtOneSolution) / (2 * aValue);
        solution2String = "No real solution!";

        txtSolution1.Text = solution1.ToString();
        txtSolution2.Text = solution2String;
    }
    else if (insideSquareRoot > 0)
    {
        //Two real solutions
        decimal sqrtTwoSolutions = (decimal)Math.Sqrt((double)insideSquareRoot);
        solution1 = (-bValue + sqrtTwoSolutions) / (2 * aValue);
        solution2 = (-bValue - sqrtTwoSolutions) / (2 * aValue);

        txtSolution1.Text = solution1.ToString();
        txtSolution2.Text = solution2.ToString();
    }

txtSolution1txtSolution2は、入力を受け取ることはできませんが、計算の結果を出力するテキスト ボックスです。

nmcAnmcBおよびnmcCエンド ユーザーによる a、b、および c 値の入力に使用される NumericUpDown コントロールです。

OK、それで、さらに一歩進んで、虚数の値も解決することを望んでいました。条件が既に設定されていることを考えると、判別式が0以下の場合にのみ虚数を考慮する必要があります0

しかし、これにアプローチする良い方法は思いつきません。複雑な解は、負の数の平方根を取得しようとすると発生し、is がいたるところに表示されます。 i = sqroot(-1)i^2 = -1

この問題に取り組む方法を知っている人はいますか、それとも時間の価値がないだけですか?

編集

もう少しグーグルで調べてみると、C# 4.0 (または .NET 4.0 のどちらかはわかりません) では組み込みの複素数サポートがあることがわかりましたSystem.Numerics.Complex。私は今これをチェックしています。

4

2 に答える 2

4

たとえば、計算しようとしている

(-b + sqrt(inside)) / (2*a)

Math.Sqrtは虚数を知らないので、 の場合は鳴きますinside < 0。しかし、答えを変えずにいつでも 1 を掛けることができます。i 2 = -1 であることに注意してください。-1 * i 2 = 1 です。したがって、-1 * i 2を掛けて単純化します。

(-b + sqrt(inside * -1 * i**2)) / (2*a)
(-b + sqrt(-inside) * sqrt(i**2)) / (2*a)
(-b + sqrt(-inside) * i) / (2*a)
-b/(2*a) + sqrt(-inside)/(2*a) * i

したがって、次の C# コード:

solution1String = (-b/(2*a)).ToString() +
                      " + " + (Math.Sqrt(-inside)/(2*a)).ToString() + " i";
于 2010-11-08T23:17:21.773 に答える
0

では、あなたが抱えていると思われる問題は何ですか?すでに想像上の結果をチェックしています。それに応じて計算するだけです。正の値の平方根を実行し、実部と虚部を追跡します。

于 2010-11-08T22:58:04.960 に答える