首頁
學習
實踐
活動
工具
TVP
返回騰訊雲官網
如何解決“mul對象沒有屬性”cos“”
原文
mkrieger1修改於2021-08-02
python
sympy
如何解決多目標問題?
import sympy as sym
from sympy import lambdify
x = sym.Symbol('x')
n = sym.Symbol('n')
f = sym.sin(n*x)
derivative_f = f.diff(x)
derivative_f = lambdify(x, derivative_f)
x = float(input('x:'))
print(derivative_f(x))
print(derivative_f)
復制
如果我輸入2,那麽預期的結果應該是2*cos(2*x)。
瀏覽 42關註 0得票數 0
原文
2 個回答
高票數
操作
JohanC已采納
回答於2021-08-02
得票數 2
您的代碼包含壹些誤解。壹個問題是壹個重要的通用編程規則:嘗試對具有不同含義的變量使用不同的變量名。因此,x不應該被賦值為浮點數,因為它以前是壹個符號變量。derivative_f是壹個符號表達式,不應該被賦值為lambdify的結果。
請註意,sympy的符號世界與非漸近函數的數字世界不能很好地混合。lambdify在這些世界之間建立了壹座橋梁,從完全符號到完全數字。例如,使用lambdify創建的函數不再具有訪問符號n的權限。
代碼lambdify(x, derivative_f)包含錯誤。derivative_f是壹個包含兩個符號變量(x和n)的符號表達式,因此需要將其調用為derivative_f_x_n = lambdify((x, n), derivative_f) (也為結果指定了壹個不同的名稱)。之後,您可以將數字表達式用作derivative_f_x_n(7, 8),但不能再使用符號參數。
對於您似乎正在嘗試做的事情,lambdify是不夠的。要獲得替換了x的派生結果,可以直接在derivative_f的符號版本上調用.subs(x, new_value)輸出:n*cos(2.0*n)
還要註意,漸近強烈傾向於使用精確的符號表達式,使用浮點數不可避免地會帶來近似值。只要有可能,建議使用整數、漸近分數(sym.S(1)/2)或符號表達式(sym.sqrt(5))。
您還可以使用關於x的派生函數,然後替換為n
print(f.diff(x).subs(n, 2))
復制
輸出:2*cos(2*x)
要在以後的數值計算中使用該函數,在替換之後,只剩下壹個符號變量(x):
g = lambdify(x, f.diff(x).subs(n, 2))
復制
您可以輸入help(g)查看其生成的源代碼:然後妳可以使用g來創建matplotlib圖。在lambdify之後,壹切都不再是象征性的。