偏导数的可视化
flyfish
函数
f
(
x
,
y
)
=
sin
(
x
)
⋅
cos
(
y
)
f(x, y) = \sin(x) \cdot \cos(y)
f(x,y)=sin(x)⋅cos(y)
import numpy as np
from sympy import lambdify, sin, cos
from sympy.abc import x, y
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 创建一个用于计算和可视化的类
class FunctionVisualization:
def __init__(self, num=301):
"""
初始化类,并设置网格数量和函数定义
"""
self.num = num
# 创建 x 和 y 的坐标轴
self.x_array = np.linspace(-3, 3, self.num)
self.y_array = np.linspace(-3, 3, self.num)
self.xx, self.yy = np.meshgrid(self.x_array, self.y_array)
# 定义较简单的函数 f_xy
self.f_xy = sin(x) * cos(y)
# 将 SymPy 函数转换为 NumPy 可执行的函数
self.f_xy_fcn = lambdify([x, y], self.f_xy)
def compute_function_values(self):
"""
计算函数在网格上的值
"""
return self.f_xy_fcn(self.xx, self.yy)
def plot_function(self, f_zz):
"""
绘制函数的三维图和二维等高线图
:param f_zz: 函数在网格上的值
"""
fig = plt.figure(figsize=(12, 6))
# 设置颜色方案
contour_color = '#008080' # 青色等高线
contourf_color = 'viridis' # 等高线填充颜色图谱
# 三维图
ax = fig.add_subplot(1, 2, 1, projection='3d')
ax.plot_wireframe(self.xx, self.yy, f_zz, color=[0.7, 0.7, 0.7], linewidth=0.25)
# 绘制等高线
colorbar = ax.contour(self.xx, self.yy, f_zz, 20, cmap=contourf_color)
ax.contour(self.xx, self.yy, f_zz, levels=[0], colors=contour_color, linestyles='-')
fig.colorbar(colorbar, ax=ax)
ax.set_proj_type('ortho')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel(r'$f(x, y)$')
ax.view_init(azim=-135, elev=30)
ax.grid(False)
# 二维等高线图
ax2 = fig.add_subplot(1, 2, 2)
colorbar = ax2.contourf(self.xx, self.yy, f_zz, 20, cmap=contourf_color)
ax2.contour(self.xx, self.yy, f_zz, levels=[0], colors=contour_color, linestyles='-')
fig.colorbar(colorbar, ax=ax2)
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_aspect('equal', adjustable='box')
plt.tight_layout()
plt.show()
def visualize_function(self):
"""
计算并可视化函数
"""
# 计算函数值
f_zz = self.compute_function_values()
# 绘制函数
self.plot_function(f_zz)
# 创建类的实例并进行可视化
visualization = FunctionVisualization()
visualization.visualize_function()
计算并可视化
f
(
x
,
y
)
=
sin
(
x
)
⋅
cos
(
y
)
f(x, y) = \sin(x) \cdot \cos(y)
f(x,y)=sin(x)⋅cos(y)关于 x 的偏导数
计算并可视化
f
(
x
,
y
)
=
sin
(
x
)
⋅
cos
(
y
)
f(x, y) = \sin(x) \cdot \cos(y)
f(x,y)=sin(x)⋅cos(y) 关于 y 的偏导数
compute_function_values:计算函数在网格上的值。
compute_partial_derivative:计算关于给定变量的偏导数。
plot_partial_derivative:绘制偏导数的三维图和二维等高线图。
visualize:调用方法来计算并可视化偏导数。
import numpy as np
from sympy import lambdify, diff, sin, cos
from sympy.abc import x, y
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 创建一个用于计算和可视化的类
class FunctionVisualization:
def __init__(self, num=301):
"""
初始化类,并设置网格数量和函数定义
"""
self.num = num
# 创建 x 和 y 的坐标轴
self.x_array = np.linspace(-3, 3, self.num)
self.y_array = np.linspace(-3, 3, self.num)
self.xx, self.yy = np.meshgrid(self.x_array, self.y_array)
# 定义较简单的函数 f_xy
self.f_xy = sin(x) * cos(y)
# 将 SymPy 函数转换为 NumPy 可执行的函数
self.f_xy_fcn = lambdify([x, y], self.f_xy)
def compute_function_values(self):
"""
计算函数在网格上的值
"""
return self.f_xy_fcn(self.xx, self.yy)
def compute_partial_derivative(self, variable):
"""
计算函数关于某一变量的偏导数
:param variable: 求导的变量,x 或 y
"""
# 计算偏导数
df_d_var = diff(self.f_xy, variable)
# 将偏导数函数转换为可执行函数
df_d_var_fcn = lambdify([x, y], df_d_var)
# 返回在网格上的偏导数值
return df_d_var_fcn(self.xx, self.yy)
def plot_partial_derivative(self, variable, df_d_var_zz):
"""
绘制函数关于某一变量的偏导数的三维图和二维等高线图
:param variable: 偏导数变量
:param df_d_var_zz: 偏导数在网格上的值
"""
fig = plt.figure(figsize=(12, 6))
# 设置颜色方案
contour_color = '#FFA500' # 橙色等高线
contourf_color = 'coolwarm' # 等高线填充颜色图谱
# 三维图
ax = fig.add_subplot(1, 2, 1, projection='3d')
ax.plot_wireframe(self.xx, self.yy, df_d_var_zz, color=[0.7, 0.7, 0.7], linewidth=0.25)
# 绘制等高线
colorbar = ax.contour(self.xx, self.yy, df_d_var_zz, 20, cmap=contourf_color)
ax.contour(self.xx, self.yy, df_d_var_zz, levels=[0], colors=contour_color, linestyles='-')
fig.colorbar(colorbar, ax=ax)
ax.set_proj_type('ortho')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel(fr'$\frac{{\partial f}}{{\partial {variable}}}$')
ax.view_init(azim=-135, elev=30)
ax.grid(False)
# 二维等高线图
ax2 = fig.add_subplot(1, 2, 2)
colorbar = ax2.contourf(self.xx, self.yy, df_d_var_zz, 20, cmap=contourf_color)
ax2.contour(self.xx, self.yy, df_d_var_zz, levels=[0], colors=contour_color, linestyles='-')
fig.colorbar(colorbar, ax=ax2)
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_aspect('equal', adjustable='box')
plt.tight_layout()
plt.show()
def visualize(self):
"""
计算并可视化函数及其偏导数
"""
# 计算并可视化 f_xy 关于 x 的偏导数
df_dx_zz = self.compute_partial_derivative(x)
self.plot_partial_derivative('x', df_dx_zz)
# 计算并可视化 f_xy 关于 y 的偏导数
df_dy_zz = self.compute_partial_derivative(y)
self.plot_partial_derivative('y', df_dy_zz)
# 创建类的实例并进行可视化
visualization = FunctionVisualization()
visualization.visualize()