偏导数的可视化

发布于:2024-08-14 ⋅ 阅读:(130) ⋅ 点赞:(0)

偏导数的可视化

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()