【问题标题】:How to plot a symbolic function under specific intervals如何在特定间隔下绘制符号函数
【发布时间】:2021-10-14 09:18:30
【问题描述】:

我打算绘制以下函数:

X = [x, y]
f = c'X + norm(c)* (sum(cos^2(X)) - sum(log(b-aX))
c = [7,2]
a = [2,3;4,6]
b = [10, 50]

所以我想得到这个

7x+2y+7.2*(cos^2(pi*x)+cos^2(pi*y))-(log(10-2x-3y)+ log(50-4x-6y)+log(x)+log(y))

如何绘制上述函数,比如说-5<=x<=5 和 -3

我尝试了以下方法:

import numpy as np
import matplotlib.pyplot as plt
from sympy import symbols
x,y = symbols(['x','y'])

c = np.array([7,2])                
A = np.array([[2,3],[4,6]])               
b = np.array([10,50])

那么接下来该怎么办??不知道要不要用linspace??

plt.plot(A*x+norm*(np.sum(np.cos^2(pi*x))-np.sum(log10(b-A*x))

【问题讨论】:

    标签: python numpy matplotlib sympy


    【解决方案1】:

    您可以使用 sympy 函数 sympy.Function('cos')(x)('log')(x) 然后 lambdify强>。我没有写下确切的功能太长了,但简化的版本是这样的

    import sympy
    from sympy import *
    from sympy.utilities.lambdify import lambdify, implemented_function
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import cm
    
    if __name__=="__main__":
        
        x, y = symbols('x y')
        
        X = np.array([x,y])
        
        a = np.array([[2,3],[4,6]])
        b = np.array([10, 50])  # np.tile(b, (2,1))
        c = np.array([7, 2])
        
        fPart1 = sum(c*np.array( X ) )
        fPart2 = sum(np.array( c*np.array([sympy.Function('cos')(x) for x in X])))
        fPart3a = sum(c*np.array( sympy.Function('log')(sum(b - a[0,:]*X) )))
        fPart3b = sum(c*np.array( sympy.Function('log')(sum(b - a[1,:]*X) )))
    
        fPart3 = fPart3a + fPart3b
    
        
        zFunction = lambdify([x, y], fPart1 + fPart2*fPart2 + fPart3)
    
        xValues = np.linspace(-5, 5, 100)
        yValues = np.linspace(-3, 2, 100)
       
        X, Y = np.meshgrid(xValues, yValues)
    
        Z = zFunction(X, Y)
    
        fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
    
        surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm, linewidth=0, antialiased=False)
        ax.set_xlabel('X', fontsize=20, rotation=150)
        ax.set_ylabel('Y', fontsize=20)
        ax.set_zlabel('Z', fontsize=20)
    
        plt.show()
    
    

    打印功能以了解您想要的功能

    In [4]: fPart1
    Out[4]: 7*x + 2*y
    
    In [5]: fPart2
    Out[5]: 7*cos(x) + 2*cos(y)
    
    In [6]: fPart3
    Out[6]: 9*log(-4*x - 6*y + 60) + 9*log(-2*x - 3*y + 60)
    

    【讨论】:

    • 谢谢!你让我很开心;)我在玩我的版本,但出现了很多错误!
    • 我做了 b= np.array 然后 fpart3 = sum(np.array( cnp.array([sympy.Function('log')(b.T- ax) for x in X])))),但为什么会出错?
    • 这对我有用,fpart3 = sum(np.array(c*np.array([sympy.Function('log')(b - a*x) for x in X])) )
    • 输出 = 7*log([[10 - 2*x, 50 - 3*x], [10 - 4*x, 50 - 6*x]]) + 2*log([ [10 - 2*y, 50 - 3*y], [10 - 4*y, 50 - 6*y]])
    • 我编辑了答案。
    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    相关资源
    最近更新 更多