在Python中绘制SymPy结果

3

我正在使用sympy来解决b1和b2的问题:

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个回答

6
使用最新版本的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))

通过输出图形: 在此输入图片描述

4
据说Sympy有自己的绘图功能,但我无法从他们的手册中让其正常工作。我不是Sympy的活跃用户。 但以下是使用numpy和matplotlib的实现方式。
  • Define your function so it can act on a np.array
  • Spread points uniformly in some range "x"
  • act on those points with your function "y"
  • plot the set of uniformly spaced points "x" vs function values in those points "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()
    
您应该得到类似于这样的东西:

在此输入图片描述


这个答案没有使用sympy的强大功能,因此无法用于在sympy中绘制复杂函数。以下是如何使用lambdify获取numpy数组,然后使用matplotlib绘制函数的方法- https://dev59.com/nlsW5IYBdhLWcg3wHEDZ#35395086 - Mohit Pandey
不确定您的意思,您可以像这样绘制任何所需的函数,即使是非解析函数。自然地,在某些时候,您可能需要添加自己的代码来评估它,而sympy可能会足够智能地自行完成此操作。您链接的答案涉及到了lambdify,您也可以这样做。[即使对于相当复杂的函数](http://mathb.in/143777)。正如我所说,这个答案并没有直接回答OP的问题,因为它没有使用sympy,但是您可以使用numpy获得相同的结果。在函数的复杂度或执行时间方面,numpy没有特定的限制,而sympy则有。 - ljetibo
1
是的,我同意你的回答可以绘制任何我们想要的函数。链接的答案改进了你的答案。您可以首先在sympy中进行任何想要的计算,然后使用lambdify将函数导入numpy,最后使用matplotlib绘制它。[详细示例](https://github.com/mohitpandey92/counterdiabatic-driving/blob/master/codes/CD_driving.ipynb) - Mohit Pandey
1
哦,我现在明白你的意思了。你可以在numpy中做同样的事情,对于比求导更复杂的操作,你可能还需要scipy。使用lambdify和sympy相比,它更容易且更短。 - ljetibo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接