How to numerically solve an equation (translate code from Matlab to Python)
How to numerically solve an equation (translate code from Matlab to Python)
我找不到任何等效的 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
有几个问题:
- 你在混用 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)
我找不到任何等效的 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
有几个问题:
- 你在混用 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)