首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何数值求解方程(从Matlab到Python的代码转换)

如何数值求解方程(从Matlab到Python的代码转换)
EN

Stack Overflow用户
提问于 2021-11-29 14:37:33
回答 1查看 111关注 0票数 0

我找不到任何等价的Matlab函数巴索夫,它数值求解一个方程。以下是我的尝试

Python:

代码语言:javascript
运行
AI代码解释
复制
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)

它会产生以下错误

代码语言:javascript
运行
AI代码解释
复制
TypeError: loop of ufunc does not support argument 0 of type Mul which has no callable sin method

原始Matlab代码:

代码语言:javascript
运行
AI代码解释
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-29 17:06:34

有几个问题:

  • 你把同情和裸体混为一谈。Numpy处理数值输入,因此np.sin尝试计算2*alfa,然后得到您提到的错误。对于符号表达式,您需要使用sympy.sin代替。
  • 修正后会发现,python中的==用于对象相等(布尔值),与符号相等无关。对于后者,您需要sympy.Eq(lhs, rhs)
  • 但这是不相关的,因为要数值求解方程,您需要使用sympy.nsolve,并使用sympy.nsolve(lhs-rhs, variable, initial_guess)

总之,下面的代码产生与Matlab相同的结果。采取了一些小的自由,即把结果放在一个一维数组,而不是一个“列向量”,实际上是一个二维数组。但是解决方案的精神是存在的,您可以很容易地修改结果格式。

代码语言:javascript
运行
AI代码解释
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70162171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档