0

これが私の問題です(該当する例を示しています):

... some code 
### x=0.5*t*(copysign(1, t - 0.5) + 1) + 0.1  
### x=string value
X= Matrix(len(x),1,x)
>>>print X[0]
0.5*t*(copysign(1, t - 0.5) + 1) + 0.1
>>>print type(X[0])
<class 'sympy.core.add.Add'>

t1=linspace(0,1,2) 

REF=[]

for i in range(len(t1)):
    REF.append(M_ref[0].subs(t,t1[i]))
>>>print REF
0.100000000000000, 0.5*copysign(1, 0.5) + 0.6

「 sympy.core.numbers.Float REF[0]」クラスからのものREF[1]ですが、「sympy.core.add.Add」クラスからのものです ( linspace. したがって、コードの残りの部分ではそれらを使用できません。使用してみましevalfたが、問題は解決しませんでした。

REF リストの値をすべて浮動小数点 (または整数) にする必要があります。

どんな助けでも大歓迎です。

4

1 に答える 1

0

何が起こっているのか理解できたと思います。

入力を文字列から変換しています。SymPy には copysign という関数がなく、ライブラリをsympify使用しないため、未評価のオブジェクトである を作成するだけです。最初からとして評価したい場合は、 のように sympify を呼び出すときに 2 番目の引数として追加できます。シンボリック バージョンが必要な場合は、SymPy にはまだ存在しないため、作成する必要があります。何かのようなものmathFunction('copysign')math copysign{'copysign': math.copysign}sympify('copysign(1, 2)', {'copysign': math.copysign})

class copysign(Function):
    nargs = 2
    @classmethod
    def eval(cls, x, y):
        if x.is_number and y.is_number:
            return math.copysign(x, y)

これはシンボリックに機能しますが、両方の引数が数値になるとすぐに、mathコピーサインを使用して評価されます。

>>> x, y = symbols('x y')
>>> copysign(x, y)
copysign(x, y)
>>> copysign(1, -2)
-1.0

実際には、copysign ロジックをシンボリックに再実装して、常に SymPy 型を返すようにすることをお勧めしますが、それは演習として残します。signがSymPyでどのように実装されているかを見て、アイデアを得ることができます。

于 2013-07-03T18:54:32.217 に答える