Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 尝试将Matlab.m符号函数文件转换为SymPy符号表达式_Python_Sympy - Fatal编程技术网

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

Python 尝试将Matlab.m符号函数文件转换为SymPy符号表达式,python,sympy,Python,Sympy,我有计算机生成的.m文件,用于Sapwin 4.0输出的电路传递函数 对于我目前的兴趣,.m文件的结构相当简单: 功能[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+C1*R1*R2)*s^2; out=num/den; 我想将这些.m文件中的许多转

我有计算机生成的.m文件,用于Sapwin 4.0输出的电路传递函数

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

功能[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+C1*R1*R2)*s^2;
out=num/den;
我想将这些.m文件中的许多转换为SymPy符号表达式,以便进行进一步的符号操作

使用open、infle.read()、索引行、切片以获得args和num所需的字符串,删除所有工作

因此,我只展示了简化的符号转换步骤,甚至用实际字符串替换字符串变量:

三个引号块显示了我已经尝试过的具有类似结果的备选方案,相同的底线:

TypeError:不支持*:“函数”和“符号”的操作数类型

在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'
如果.m文件的字符串正在破坏它呢? 还是我以其他方式做错了

为了更有趣,如果为了安全起见,我在“=”后面较早地切分.m den字符串,它包括前导的“+”,我得到:

TypeError:一元+:“函数”的操作数类型错误

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

好吧,让我们试着找出最小失效情况:

>>> a=sympify('E1*C2')
Traceback (most recent call last):
[...]
TypeError: unsupported operand type(s) for *: 'function' and 'Symbol'
这说明E1是这里的问题,因为它是:

(在您已经完成
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})
我假设一元“+”是一个错误对开发人员来说是一个问题。一元“+”警告似乎与sympify错误有关,并且在根据解决方案保护sympify输入时会消失,因此sympify会“正确”处理表达式字符串arg中的前导一元“+”,而不会出现在输出符号表达式中
>>> a=sympify('E1*C2')
Traceback (most recent call last):
[...]
TypeError: unsupported operand type(s) for *: 'function' and 'Symbol'
>>> a=sympify('E1')
>>> a
<function E1 at 0x7fcb04c11510>
>>> a = sympify(' ( E1 )+ ( E1*C1*R2 +E1*C2*R2 )*s', locals={'E1': E1})
>>> a
E1 + s*(C1*E1*R2 + C2*E1*R2)
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})