如何使用Python在指定x、y区间内绘制给定符号函数的图像
二元函数图像绘制实现方案
核心问题修正
你当前代码存在几个错误:
- 要绘制的是二元函数,不能用仅支持一维折线的
plt.plot,需使用等高线图或3D曲面图 - 混用sympy符号和numpy数值运算逻辑错误,直接使用numpy做数值计算即可,不需要定义sympy符号
- 语法错误:numpy中cos平方需写为
np.cos()**2或np.square(np.cos()),π需调用np.pi,自然对数用np.log而非log10,范数需调用np.linalg.norm()计算 - 缺少数值采样步骤,必须先对x、y区间采样生成网格点再逐点计算函数值
完整可运行代码
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 定义参数 c = np.array([7,2]) A = np.array([[2,3],[4,6]]) b = np.array([10,50]) c_norm = np.linalg.norm(c) # 计算结果约为7.28,和你展开的7.2接近,也可直接写7.2 # 1. 采样生成网格点 x = np.linspace(-5, 5, 100) # x区间采样100个点 y = np.linspace(-3, 2, 100) # y区间采样100个点 X, Y = np.meshgrid(x, y) # 生成二维网格矩阵 # 2. 逐点计算函数值 # 线性项:7x + 2y linear_term = c[0]*X + c[1]*Y # 余弦平方项 cos_term = c_norm * (np.cos(np.pi * X)**2 + np.cos(np.pi * Y)**2) # 对数项:注意对数参数必须大于0,小于等于0的位置返回nan,绘图时自动忽略 log_term = np.log(10 - 2*X - 3*Y) + np.log(50 -4*X -6*Y) + np.log(X) + np.log(Y) # 总函数值 f = linear_term + cos_term - log_term # 3. 可视化,两种方式可选: # 方式1:绘制等高线填色图 plt.figure(figsize=(8,6)) contour = plt.contourf(X, Y, f, levels=50, cmap='viridis') plt.colorbar(contour, label='函数值f(x,y)') plt.xlabel('x') plt.ylabel('y') plt.title('目标函数等高线图') plt.show() # 方式2:绘制3D曲面图 fig = plt.figure(figsize=(10,7)) ax = fig.add_subplot(111, projection='3d') surf = ax.plot_surface(X, Y, f, cmap='viridis', edgecolor='none') fig.colorbar(surf, shrink=0.5, aspect=5, label='函数值f(x,y)') ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('f(x,y)') ax.set_title('目标函数3D曲面图') plt.show()
注意事项
- 对数项要求所有参数大于0,因此x>0、y>0、2x+3y<10、4x+6y<50,区间内只有满足约束的区域会正常显示,其他区域为无效定义域
- 可以调整
linspace的采样点数(第三个参数)控制图像清晰度,点数越高越清晰但计算速度越慢
内容的提问来源于stack exchange,提问作者user9990604
相关产品推荐
相关产品推荐

