2017-09-11 3 views
1

ラテックスエディタがないため、ここではSympyを使用してプロットしたい区分的な関数の画像を示します。私は係数の2つの配列とxの値を渡し、それを評価して関数をプロットしたいと思います。 (編集:アルファがあるよりも、正確に一つ以上のpがある、画像更新)SymPyの再帰的区分関数と係数のリスト/配列を合計する

Piecewise Function これは、これまで(アルファおよびpはリスト/配列で、tは数である)私の試みです:

def getf(alpha,p,t): 

#Create the argument list of tuples for the SymPy.Piecewise function 
argtuples = [] 
for n,number in enumerate(alpha): 
    if n == 0: 
     argtuples.append((p[0]*x, x<alpha[0])) 
    elif 0<n and n<list(enumerate(alpha))[-1][0]: 
     argtuples.append((p[0]*alpha[0] + Sum(p[i]*(alpha[i] - alpha[i-1]),(i,1,n)) + p[n+1]*(x-alpha[n]), alpha[n-1] <= x < alpha[n])) 
    else: 
     argtuples.append((p[0]*alpha[0] + Sum(p[i]*(alpha[i] - alpha[i-1]),(i,1,n)) + p[n+1]*(x-alpha[n]), x>=alpha[n])) 

f = Piecewise(argtuples) 
return f(t) 

from sympy import Piecewise, Sum 
from sympy.abc import x, i 

getf([10000,50000,100000,1000000],[0.05,0.08,0.15,0.30,0.40],1000001) 

しかし、私は "リストのインデックスは、シンボルではなく、整数またはスライスでなければならない"というエラーを受けています。どのように配列に任意の長さを与えることができるので、私は関数に渡した係数値を参照できますか?

答えて

0

シンボリックインデックスをPythonリスト(ここではiabcからインポートしているためシンボリック)に使用することはできません。事前にリストを知っている場合は、Sumではなく、Python sum関数を使用して値を合計する必要があります。

sum(p[i]*(alpha[i] - alpha[i-1]) for i in range(1, n)) 

alpha[n-1] <= x < alpha[n]という別の問題もあります。これは残念ながら、Pythonが連鎖不等式を処理する方法のために、うまくいきません。 And(alpha[n-1] <= 1, x < alpha[n])と書かなければなりません。そうでなければ、TypeError: cannot determine truth value of Relationalとなります。

+0

ありがとう、これはSymPy.And()関数を助けました。しかし、引数リストを作成する前に、アルファの累積合計を計算するコードを書き直しました。 TypeError:__new __()は3つの位置引数をとりますが、7が与えられました すべてのアイデアなぜそれが勝利したのか私は累積合計を持っていると思います。 7つの議論を取る?ドキュメントでは、Piecewise()の間隔を任意に設定できるようです。 –

+0

Piecewiseはどのように作成していますか?実際には、任意の数の引数をサポートしています。 TypeErrorは他のものから来ている可能性があります。 – asmeurer

関連する問題