2015-05-08 71 views
2

sympy結果我使用sympy來解決B1和B2:繪製在python

y=x/[x+exp(b1-b2*x)] 
x1 = 90; y1 = 0.05 and x2=99;y2=0.95 


import sympy 
b1,b2 = symbols('b1 b2') 
solve([Eq(90*0.05+90*exp(b1-(b2*90))-90, 0.0), Eq(99*0.95+99*exp(b1-(b2*99))-99, 0.0)], [b1, b2]) 

>>> {b1:29.3930964972769,b2:0.327159886574049} 

如何使用這些結果來繪製這些數值限制的S形曲線。 Y軸的範圍從0到1. x1,y1和x2,y2是該曲線上的2個點。

回答

3

Sympy據稱擁有自己的繪圖功能,但是我無法從手冊中獲得它的幫助。我不是sympy的活躍用戶。

但這裏有一個如何與numpymatplotlib

  • 做定義你的功能,所以它可以統一在一定範圍內對np.array
  • 傳播點起一版的「X」
  • 使用您的函數「y」對這些點執行操作
  • 繪製均勻間隔點「x」對這些點中的函數值「y」的集合

    import numpy as np 
    import matplotlib.pyplot as plt 
    
    def f(a): 
        c1 = 0.327159886574049 
        c2 = 29.3930964972769 
        return a/(a+np.exp(c1-c2*a)) 
    
    x = np.linspace(0, 1, 500) 
    y = f(x) 
    plt.plot(x,y) 
    plt.show() 
    

你應該得到這樣的事情:

enter image description here

+0

這答案並不使用sympy的力量,而是因此,此方法不能用於繪製sympy中的複雜函數。這裏是如何使用lambdify獲得一個numpy數組,然後使用matplotlib來繪製函數 - https://stackoverflow.com/a/35395086/3797285 –

+0

不確定你的意思,你可以繪製任何你想要的函數喜歡這個。即使是非分析的。當然,在某些時候,你可能需要添加自己的代碼來評估它,sympy可能足夠聰明,可以自己完成。你鏈接的答案涉及你也可以做的lambdify。 [即使是相當複雜的功能](http://mathb.in/143777)。正如我所說,這個答案不直接回答OP,因爲它不使用sympy,但你可以用numpy得到相同的結果。 func沒有特別的限制。複雜性或執行時間,這會阻止numpy而不是sympy。 – ljetibo

+1

是的,我同意你的觀點,你的答案允許繪製我們想要的任何功能。鏈接的答案可以提高你的答案。你可以先在sympy中做任何你想做的計算,然後使用lambdify將你的函數導入numpy,最後使用matplotlib繪製它。 [詳細示例](https://github.com/mohitpandey92/counterdiabatic-driving/blob/master/codes/CD_driving.ipynb) –

3

使用sympy和IPython中

In [1]: from sympy import * 

In [2]: x, b1, b2 = symbols("x b1 b2") 

In [3]: f = x/(x+exp(b1-b2*x)) 

In [4]: res = {b1:29.3930964972769,b2:0.327159886574049} 

In [5]: plot(f.subs(res), (x, 0, 100)) 

隨着輸出圖中的最新版本: enter image description here