是否可以在不使用 sympy 的情況下求解三次方程?
例子:
import sympy as sp
xp = 30
num = xp 4.44
sp.var('x, a, b, c, d')
Sol3 = sp.solve(0.0509 * x ** 3 0.0192 * x ** 2 3.68 * x - num, x)
結果是:
[6.07118098358257, -3.2241955998463 - 10.0524891203436*I, -3.2241955998463 10.0524891203436*I]
但我想找到一種方法來使用 numpy 或根本不使用 3 部分庫
我試過numpy:
import numpy as np
coeff = [0.0509, 0.0192, 3.68, --4.44]
print(np.roots(coeff))
但結果是:
[ 0.40668245 8.54994773j 0.40668245-8.54994773j -1.19057511 0.j]
uj5u.com熱心網友回復:
在您的 numpy 方法中,您對最終系數犯了兩個小錯誤。
在SymPy示例中,您的最后一個系數是- num,這是根據您的代碼:-num = - (xp 4.44) = -(30 4.44) = -34.44
在您的NumPy示例中--4.44,您的最后一個系數是,它是4.44并且不等于-34.33。
如果您編輯NumPy代碼,您將獲得:
import numpy as np
coeff = [0.0509, 0.0192, 3.68, -34.44]
print(np.roots(coeff))
[-3.2241956 10.05248912j -3.2241956 -10.05248912j
6.07118098 0.j ]
答案是這樣相同的(注意,NumPy使用j以表示復數。SymPy二手I)
uj5u.com熱心網友回復:
你可以實作
這個來自數學家的Youtube 視頻可以幫助理解它。
基于此,ax^3 bx^2 cx d = 0 的三次函式可以寫成這樣:
def cubic(a,b,c,d):
n = -b**3/27/a**3 b*c/6/a**2 - d/2/a
s = (n**2 (c/3/a - b**2/9/a**2)**3)**0.5
r0 = (n-s)**(1/3) (n s)**(1/3) - b/3/a
r1 = (n s)**(1/3) (n s)**(1/3) - b/3/a
r2 = (n-s)**(1/3) (n-s)**(1/3) - b/3/a
return (r0,r1,r2)
公式的簡化版本只需要獲取 c 和 d 作為引數(又名 p 和 q),可以這樣實作:
def cubic(p,q):
n = -q/2
s = (q*q/4 p**3/27)**0.5
r0 = (n-s)**(1/3) (n s)**(1/3)
r1 = (n s)**(1/3) (n s)**(1/3)
r2 = (n-s)**(1/3) (n-s)**(1/3)
return (r0,r1,r2)
print(cubic(-15,-126))
(5.999999999999999, 9.999999999999998, 2.0)
我會讓你混合復數運算以正確獲得所有 3 個根
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/372124.html
