如何在特定区间内绘制符号函数
How to plot a symbolic function under specific intervals
我打算绘制以下函数:
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<=y<=2?
我试过以下方法:
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))
您可以使用 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)
我打算绘制以下函数:
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<=y<=2?
我试过以下方法:
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))
您可以使用 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)