gpt4 book ai didi

python - 尝试将 Matlab .m 符号函数文件转换为 SymPy 符号表达式

转载 作者:太空宇宙 更新时间:2023-11-04 05:23:07 25 4
gpt4 key购买 nike

我有计算机生成的 .m 文件,用于 Sapwin 4.0 输出的电路传递函数 http://cirlab.dinfo.unifi.it/Sapwin4/

.m 文件对于我目前的兴趣来说结构相当简单:

function [out]=my003_v1(s,C1,C2,E1,R1,R2);
num = + ( E1 )+ ( E1*C1*R2 +E1*C2*R2 )*s;
den = + ( E1 +1 )+ ( E1*C1*R2 +C1*R2 +C1*R1 +E1*C2*R2 +C2*R2 )*s+ ( E1*C2*C1*R1*R2 +C2*C1*R1*R2 )*s^2;
out = num/den;

我想将许多这些 .m 文件转换为 SymPy 符号表达式以进行进一步的符号操作

打开、infile.read()、索引行、切片以获得所需的 args 和 num 字符串、den 所有工作

所以我只展示了简化的符号转换步骤,甚至将字符串变量替换为实际字符串:

from sympy import symbols, var, sympify

var('s,C1,C2,E1,R1,R2')
'''

#awkward alternative to var:
exp_str='s,C1,C2,E1,R1,R2' + " = symbols('" + 's,C1,C2,E1,R1,R2' + "')"
exec(exp_str)
print(exp_str)
'''

a=sympify(' ( E1 )+ ( E1*C1*R2 +E1*C2*R2 )*s')
'''
# another alternative to sympify:
from sympy.parsing.sympy_parser import (parse_expr,
standard_transformations)

parse_expr(' ( E1 )+ ( E1*C1*R2 +E1*C2*R2 )*s', transformations=(standard_transformations))
'''

三引号 block 显示了我已经尝试过的替代方案,结果相似,底线相同:

TypeError: unsupported operand type(s) for *: 'function' and 'Symbol'

在 SympyLive 上运行的带有代码的错误报告:

Traceback (most recent call last):
File "<string>", line 12, in <module>
File "/base/data/home/apps/s~sympy-live-hrd/46.393464279709602171/sympy/sympy/core/sympify.py", line 322, in sympify
expr = parse_expr(a, local_dict=locals, transformations=transformations, evaluate=evaluate)
File "/base/data/home/apps/s~sympy-live-hrd/46.393464279709602171/sympy/sympy/parsing/sympy_parser.py", line 894, in parse_expr
return eval_expr(code, local_dict, global_dict)
File "/base/data/home/apps/s~sympy-live-hrd/46.393464279709602171/sympy/sympy/parsing/sympy_parser.py", line 807, in eval_expr
code, global_dict, local_dict) # take local objects in preference
File "<string>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'function' and 'Symbol'

我在 IPython 和常规控制台上最近安装的 Anaconda3 Spyder 上看到了类似的错误

sympify 似乎在 SymPy Live 中使用类似的表达式结构:

>>> sympify(x*y+(z**k+x*y*z)*t)
t(xyz+zk)+xy


... sympify('-(x**k+ y*z*t+ m)*z')
z(−m−tyz−xk)

.m 文件 den string 是怎么回事?还是我以其他方式做错了?

为了更有趣,如果我在“=”之后更早地分割 .m den 字符串以确保安全,它包括前导“+”,我得到:

TypeError: bad operand type for unary +: 'function'

这是一个可以通过过滤解决的问题,但不允许这种一元使用“+”似乎是一个糟糕的假设传递函数中的分子项很容易为正或负

最佳答案

好吧,让我们试着找到最少的失败案例:

>>> a=sympify('E1*C2')
Traceback (most recent call last):
[...]
TypeError: unsupported operand type(s) for *: 'function' and 'Symbol'

这清楚地表明这里的问题是 E1,因为它是 existing function :

>>> a=sympify('E1')
>>> a
<function E1 at 0x7fcb04c11510>

因此出现错误信息。解决这个问题的一种方法是通过在 locals 参数中覆盖它来指定您不希望 E1 成为函数:

>>> a = sympify(' ( E1 )+ ( E1*C1*R2 +E1*C2*R2 )*s', locals={'E1': E1})
>>> a
E1 + s*(C1*E1*R2 + C2*E1*R2)

(在您已经完成 var 以在命名空间中创建 E1 之后),或者更一般地说,如果您想保护 vv< 中的所有内容:

vv = sympy.var('s,C1,C2,E1,R1,R2')
a=sympify(' ( E1 )+ ( E1*C1*R2 +E1*C2*R2 )*s', locals={str(v):v for v in vv})

关于python - 尝试将 Matlab .m 符号函数文件转换为 SymPy 符号表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39682366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com