我找不到任何等效的 Matlab 函式vpasolve,它可以數值求解方程。以下是我的嘗試
Python:
alfa = sympy.Symbol('alfa')
y = np.linspace(0, 100, 6)
angleR = np.zeros((1, np.size(y)))
i = 1
for x in range(0, 100, 20):
p = x/100
angleR[0, i] = np.rad2deg((sympy.solve(2*np.pi*(1-p) == np.sin(2*alfa), alfa)).astype(float))
i = i 1
print(angleR)
產生以下錯誤
TypeError: loop of ufunc does not support argument 0 of type Mul which has no callable sin method
原始Matlab代碼:
syms alfa
y = 0:20:100;
angleR = zeros(1, length(y));
i = 1;
for j = 0:20:100
p = j/100;
angleR(i) = rad2deg(double(vpasolve(2*pi*(1-p) == 2*alfa - sin(2*alfa), alfa)));
i = i 1
end
uj5u.com熱心網友回復:
有幾個問題:
- 你混合了 sympy 和 numpy。Numpy 處理數字輸入,因此
np.sin嘗試評估2*alfa并得到您提到的錯誤。對于符號運算式,您需要sympy.sin改用。 - 修復這將揭示
==在 python 中用于物件相等(布林值),與符號相等無關。對于后者,您需要sympy.Eq(lhs, rhs). - 但這無關緊要,因為要以數值方式求解方程,您需要
sympy.nsolve使用sympy.nsolve(lhs-rhs, variable, initial_guess).
總而言之,以下代碼產生與 Matlab 相同的結果。采取了一些次要的自由,即將結果放在一維陣列而不是“列向量”中,這實際上是一個二維陣列。但解決方案的精神就在那里,您可以輕松修改結果格式。
import numpy as np
import sympy as sym
alfa = sym.Symbol('alfa')
p_values = np.arange(0, 101, 20) / 100
angleR = [
np.rad2deg(float(sym.nsolve(2*np.pi*(1-p) - 2*alfa sym.sin(2*alfa), alfa, 0)))
for p in p_values
]
angleR = np.array(angleR)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/370339.html
