2016-09-25 56 views
2

我已生成的.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'

這是一個問題可以通過過濾來解決,但不允許這個一元使用「+」似乎是一個不好的假設 傳遞函數中的分子項可能很容易是正數或負數

回答

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> 

,因此錯誤消息。要解決這個問題的一個方法是指定在當地人的說法覆蓋它,你不想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

相關問題