2

私が書いているプログラムでは、ユーザーは 2 次多項式または 3 次多項式の 3 次関数を解くかどうかを選択できます。選択すると、プログラムは次を含む多くの式を適用します: 2 次判別式の解、2 次式、2 次多項式の式、Cardano の類似の 3 次多項式の方法、および標準の 3 次式 (基本的に、最初のこのページの 4 つの数式)。

これが私のコードです:

import math

def deg3():
    print("This is a third degree polynomial calculator.")
    print("Please enter four numbers.")
    a = int(input())
    b = int(input())
    c = int(input())
    d = int(input())

# Apply Cardano's compressed method to find x root, broken up into different variables.
p = (-1 * b)/(3 * a)
q = p ** 3 + (b * c - (3 * a * d))/ (6 * (a ** 2)) 
r = c / (3 * a)

x = (q + (q**2 + (r - p**2)**3) **1/2) **1/3 + (q + (q**2 + (r - p**2)**3) **1/2) **1/3 + p
print("The root is:", x)

# Applies final cubic formula, and returns.
total = (a * x**3) + (b * x**2) + (c * x) + d
total = round(total, 3)
return total

# If discr > 0, then the equation has three distinct real roots.
# If discr = 0, then the equation has a multiple root and all its roots are real.
# If discr < 0, then the equation has one real root and
# two nonreal complex conjugate roots.

合計を簡単に返すようになりました。計算は正しいですが、私はまだ類似の式に頭を悩ませようとしています。方程式の判別部分は何ですか? 二次方程式の場合のように、潜在的な根を見つけるにはどうすればよいですか? おそらく簡単な質問ですが、プロセスをよりよく理解したいと思います。

4

1 に答える 1

1

まず、リンク先のサイトの3次関数と方程式には多くの違いがあります。最も注目すべきものの中で:

  1. 操作の順序がずれています:次のような行:

    big = (-1 *( b**3 / 27 * a**3) + (b * c / 6 * a**2) - (d / 2 * a))
    

    する必要があります:

    big = (-1 *( b**3 / (27 * a**3)) + (b * c / (6 * a**2)) - (d / (2 * a)))
    

    それ以外の場合、のような用語27 * a**3は分母になりません。代わりに、分母以降は27と見なされa**3ます。

  2. リンク先の方程式に2つある場合でも、立方根を含めることはありません。

  3. あなたはそうしますx * 2 - smallが、方程式に足し合わされた2つの項目は同一ではありません。一方にはプラス記号があり、もう一方にはマイナス記号があります。

ただし、関数のすべての問題を修正しても、多くの3次方程式を解こうとすると、数学ドメインエラーが発生します。リンクから次の段落に注意してください。

しかし、この例にカルダノの公式を適用すると、a = 1、b = 0、c = -15、d = -4を使用し、結果の計算で-109の平方根を取る必要があることがわかります。最終的に、負の数の平方根は計算の後半でキャンセルされますが、その計算は、複素数についての追加の議論なしに微積分学の学生が理解することはできません。

三次方程式を解くには、複素数を処理する必要があります(ただし、前述のように、それらはキャンセルされます)。そのため、それmath.sqrtを解くために使用することはできません。cmathパッケージに興味があるかもしれません。

于 2012-11-11T05:28:45.817 に答える