2016-04-17 10 views
4

Sagemathを使用して区分関数を統合しようとしており、不可能であることがわかりました。私の元のコードは以下の通りですが、偶発的な評価のために間違っています。hereSagemathの区分関数を統合してプロットする

def f(x): 
    if(x < 0): 
     return 3 * x + 3 
    else: 
     return -3 * x + 3 

g(x) = integrate(f(t), t, 0, x) 

ウェブサイト上で述べたプロットするための修正はf代わりのf(t)を使用することであるが、TypeErrorが上昇したので、これはintegrate()機能について明らかにサポートされていません。

私が気付いていない修正がありますか?

答えて

2

代わりのdefを経由して区分関数を定義し、内蔵のpiecewise classを使用します。

f = Piecewise([[(-infinity, 0), 3*x+3],[(0, infinity), -3*x+3]]) 
f.integral() 

出力:

Piecewise defined function with 2 parts, [[(-Infinity, 0), x |--> 3/2*x^2 + 3*x], [(0, +Infinity), x |--> -3/2*x^2 + 3*x]] 

区分関数は、.plot()など、独自のメソッドを持っています。しかし、プロットは無限の間隔をサポートしていません。プロットは有限の間隔で得ることができます。

f = Piecewise([[(-5, 0), 3*x+3],[(0, 5), -3*x+3]]) 
g = f.integral() 
g.plot() 

gからg(0)を減算したい場合もあります。これはg-g(0)ほど単純ではありませんが、それほど悪くはありません。g.list()でピースのリストを取得し、各関数からg(0)を減算して再結合します。

g0 = Piecewise([(piece[0], piece[1] - g(0)) for piece in g.list()]) 
g0.plot() 

そしてそこに、あなたはそれを持っている:

plot

このアプローチを拡張することによって、私たちも、最初からFに有限の間隔を置く必要はありません。次のプロットG - G(0)、B]は、ドメイン変更することにより、所定の間隔で:区分クラスを使用することに加えて

a = -2 
b = 3 
g0 = Piecewise([((max(piece[0][0], a), min(piece[0][1], b)), piece[1] - g(0)) for piece in g.list()]) 
g.plot() 

plotrange

+0

私はPiecewiseクラスを調べました。正直なところ、これは役に立たないもののようです。式の機能を拡張するものではないので、定数を追加するか、別の式の一部として使うなどの基本的なことはできません。その結果、私はg(0)を引く必要があるので、定積分をプロットする私の本来の目標を達成することはできません。 –

+0

ここで、定数を減算する方法を説明しました。 –

+0

結論は次のとおりです。クラスは開発が遅れていますが、Pythonのリストレベルにドロップして戻ってくることで、それ以上のことができます。 –

1

が、これは容易で固定することができますだけで正常に動作しplot(g)その後

def f(x): 
    if(x < 0): 
     return 3 * x + 3 
    else: 
     return -3 * x + 3 

def g(x): 
    (y, e) = integral_numerical(f, 0, x) 
    return y 

g(x) Pythonの関数として、同様の定義。

関連する問題