• python数学建模--sympy三维图像绘制


    问题引出

    在求解二元函数最值的时候,我们不知道自己经过若干个步骤求出的结果是否正确,那么我们该怎么办呢?一种办法就是将这个函数的图像绘制出来
    三维图像的作用在于,它不仅能让我们直观的看出待求二元函数在指定区间内的形状,而且对于我们求得的最值以及求极值的步骤有着重要的指导意义

    库选择与绘制准备

    matplotlib是一个比较基础的专业绘图库,它也可以用来绘制三维图像,但是需要额外导入mpl_toolkits库,在前段时间学习sympy库时注意到了它里面的plotting子模块,里面封装了若干个绘图类,其中的一个plot3d类可以实现三维绘图,而且调用十分方便

    注意,sympy中的绘图类仍然使用matplotlib库提供的后端支持,也就是说使用sympy绘图类需要首先安装matplotlib

    plot3d类api简介

    plot3d(*args, show=True, **kwargs)
    
    • 1

    图像绘制与参数说明

    同一坐标系内绘制单个图像

    plot3d(expr, range_x, range_y, **kwargs)
    
    • 1
    参数描述
    expr函数表达式
    range_x,range_y变量x,y的取值区间(默认区间为[-10,10])

    在同一坐标系内绘制双图像(两个二元函数)

    plot3d(expr1,expr2, range_x, range_y, **kwargs)
    
    • 1

    同一坐标系内绘制多个图像(多个二元函数)

    plot3d((expr1, range_x, range_y),(expr2, range_x, range_y,) ,...,**kwargs)
    
    • 1

    关键字参数

    参数名数据类型描述
    nb_of_points_xint在该参数处对x取值范围均匀采样
    nb_of_points_yint在该参数处对y取值范围均匀采样
    surface_colorFunction which returns a float绘出图像的颜色
    titlestr图像标题
    size(float, float)图像尺寸

    绘图举例

    下面例子来自sympy官网

    # 单图像
    from sympy import symbols
    from sympy.plotting import plot3d
    x, y = symbols('x y')
    plot3d(x*y, (x, -5, 5), (y, -5, 5))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行结果
    在这里插入图片描述

    # 双图像
    plot3d(x*y, -x*y, (x, -5, 5), (y, -5, 5))
    
    • 1
    • 2

    运行结果
    在这里插入图片描述

    # 多图像
    plot3d((x**2 + y**2, (x, -5, 5), (y, -5, 5)),
        (x*y, (x, -3, 3), (y, -3, 3)))
    
    • 1
    • 2
    • 3

    运行结果
    在这里插入图片描述

    绘图的案例

    读完了plot3d的api,我们尝试解决一些实际问题

    三角函数

    绘制 y = s i n x 2 + y 2 , x ∈ [ − 5 , 5 ] , y ∈ [ − 5 , 5 ] 的图像,并找出其最小值对应的坐标 绘制y=sin\sqrt{x^2+y^2},x\in [-5,5],y\in [-5,5]的图像,并找出其最小值对应的坐标 绘制y=sinx2+y2 ,x[5,5],y[5,5]的图像,并找出其最小值对应的坐标

    代码实现

    from sympy import symbols
    from sympy.plotting import plot3d
    from sympy import *
    x, y = symbols('x y')
    plot3d(sin(sqrt(x**2+y**2)),(x, -5, 5), (y, -5, 5))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行结果
    在这里插入图片描述

    注意看图像窗口的右上角,它代表三维图像上的点,会随着鼠标的指向而发生变化,虽然sympy绘图类不会返回给我们精确地函数最值,但是我们可以通过观察图像、拖动图像来找到函数最值得大概位置,这就是绘制出图像的意义所在

    另一个三角函数

    实际上,这篇博客的灵感来源于笔者最近在学习的模拟退火算法,该算法的其中一个应用方向是求带约束的二元函数极值,由于参数设置等的不同,导致对于同一个二元函数运行同样的程序,每次得到的函数极值各不相同,但是笔者也不知道哪次得到的极值是正确的,然后看到了这篇博客

    用模拟退火算法求解带约束的二元函数极值问题之二:用MATLAB绘图验证

    实际上很多时候,可视化能够解决很多想象不到的问题,于是笔者也想要尝试一下使用python进行可视化,这个例子中仍然使用原博客中的二元函数

    f ( x , y ) = 6 x 2 + x 2 + y 2 + 5 s i n ( x ) + 3 c o s ( y ) + 50 x ∈ [ − 5 , 5 ] , y ∈ [ − 5 , 5 ] f(x,y)=\frac{6x}{2+x^2+y^2}+5sin(x)+3cos(y)+50\\x\in[-5,5],y\in[-5,5] f(x,y)=2+x2+y26x+5sin(x)+3cos(y)+50x[5,5]y[5,5]

    代码实现

    from sympy import symbols
    from sympy.plotting import plot3d
    from sympy import *
    x, y = symbols('x y')
    expr=6*x/(2+x**2+y**2)+5*sin(x)+3*cos(y)+50
    plot3d(expr,(x, -5, 5), (y, -5, 5))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行结果
    在这里插入图片描述

    从上面的图中我们可以看出该二元函数的函数值范围大约在[42.5,60]之间,这就为我们的算法求解提供了一个方向

  • 相关阅读:
    【Spring】事务和事务传播机制
    【Transformer 论文笔记】Attention is all you need
    【Vue3.0】watch监听事件
    来源稳定的l2逐笔接口数据去哪找?
    一文800字手把手教你使用Docker实现分布式Web自动化
    每日OJ题_算法_双指针_力扣283. 移动零+力扣1089. 复写零
    聊聊x86计算机启动发生的事?
    关于mysql已有主从环境得主从重配置
    MFC主框架和视类PreCreateWindow()函数学习
    Node.js最新版黑马配套笔记
  • 原文地址:https://blog.csdn.net/m0_54510474/article/details/127661397