试图Matlab的.M符号函数文件(一个或多个)转换为SymPy符号表达式

问题描述:

我已生成的.m为电气电路的传递函数的输出文件由计算机4.0 Sapwin http://cirlab.dinfo.unifi.it/Sapwin4/试图Matlab的.M符号函数文件(一个或多个)转换为SymPy符号表达式

的.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(),索引行S,切片,从而获得所需的指定参数和NUM串,书房的所有工作

所以我只是显示减少甚至与实际字符串替换字符串变量的符号的转换步骤:

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)) 
''' 

三重报价块显示我已经有类似的结果,同样的底线试图替代方案:

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' 

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

sympify似乎与SymPy直播类似的表达结构的工作:

>>> 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字符串正在打破它? 还是我做错了一些其他方式?

更多的乐趣,如果我切片.M窝串较早后“=”是安全的,它包括领先的“+”,我也得到:

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> 

,因此错误消息。要解决这个问题的一个方法是指定在当地人的说法覆盖它,你不想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}) 
+0

我想一元“+”是一个错误是开发商 – f5r5e5d

+0

一元“+”的警告似乎是从抵押物的问题当Sympify输入被保护时,Sympify错误并消失,因此sympify执行“c正确地“对待表达式字符串arg中的前导一元”+“,它不会出现在输出符号表达式中 – f5r5e5d