我有计算机生成的.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符号表达式以进行进一步的符号操作
使用open,infile.read(),索引行,切片以获得args和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:*:'function'和'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'
我在Anyonda3最近的安装,Spyder,在IPython和常规控制台上看到类似的错误
在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字符串怎么打破呢? 或者我是否以其他方式做错了?
为了更有趣,如果我在“=”之后将.m den字符串切片为安全,它包含前导“+”,我得到:
TypeError:一元+的错误操作数类型:'function'
哪个问题可以通过过滤解决但不允许这种一致使用“+”似乎是一个不好的假设 传递函数中的分子项可能很容易为正或负
答案 0 :(得分:1)
好吧,让我们试着找出最小的失败案例:
>>> 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})