Loading [MathJax]/jax/output/CommonHTML/jax.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >隐函数求导与绘图

隐函数求导与绘图

原创
作者头像
密码学人CipherHUB
修改于 2025-06-06 03:17:42
修改于 2025-06-06 03:17:42
4120
举报
文章被收录于专栏:数理视界数理视界

什么是隐函数

如果一个方程中同时包含变量x和y,且y不能解出为x的显式表达式,则称该方程确定了一个y关于x的隐函数。例如:x² + y² = 1。

即使y没有显式地表示为x的函数,我们仍然可以通过对方程两边关于x求导(注意:此时y是x的函数,所以遇到y时要用链式法则),然后解出dy/dx。

链式求导法则 1
链式求导法则 1
链式求导法则 2
链式求导法则 2

示例代码

基于sympy进行求导的代码演示

求隐函数 的导数

代码语言:python
AI代码解释
复制
from __future__ import annotations

from sympy import Eq , idiff , symbols

"""
因变量已显式定义为自变量的表达式,如 f(x)=x^2+3,则求导时使用diff(f, x)
因变量与自变量的关系隐含在方程中,如 x^2+y^2=9,则求导时使用idiff(x^2+y^2-9, y, x)
diff和idiff都支持通过 n 参数指定阶数

"""

# 定义符号
x = symbols('x')
y = symbols('y')
# 定义隐函数 x^2 + y^2 = 9
# 写法1:
expr = x ** 2 + y ** 2 - 9
# 对隐函数 x^2 + y^2 = 9 求 dy/dx 的导数
dy_dx_auto = idiff(expr , y , x)
print(f"expr = {expr}, dy/dx = {dy_dx_auto}")

# 写法 2:
expr_2 = Eq(x ** 2 + y ** 2 , 9)
dy_dx_auto_2 = idiff(expr_2.lhs - expr_2.rhs , y , x)
print(f'expr_2 = {expr_2}, dy/dx = {dy_dx_auto_2}')

# 写法 3:
dy_dx_auto_3 = idiff(expr_2.lhs , y , x)
print(f'expr_2 = {expr_2}, dy/dx = {dy_dx_auto_3}')
使用 sympy 进行隐函数求导时的三种写法
使用 sympy 进行隐函数求导时的三种写法

相关变化率问题举例

相关变化率(滑动梯子问题):10m长的梯子靠墙下滑,底端以1m/s远离墙面。当底端离墙6m时,顶端下滑速度是多少?

设梯子底端到墙的距离为x(米),顶端高度为y(米),则x² + y² = 10²。

梯子滑动问题逻辑示意图
梯子滑动问题逻辑示意图
代码语言:python
AI代码解释
复制
from __future__ import annotations

from sympy import Eq , Function , diff , solve , sqrt , symbols

# 定义符号
t = symbols('t')  # 时间变量
L = symbols('L')  # 梯子长度(符号常量)
x = Function('x')(t)  # 底端距离函数
y = Function('y')(t)  # 顶端高度函数

# 1. 建立几何约束方程(勾股定理)
constraint = Eq(x ** 2 + y ** 2 , L ** 2)

# 2. 对约束方程关于时间t求导(隐函数求导)
derivative_eq = diff(constraint.lhs - constraint.rhs , t)

# 3. 整理导数关系式
dy_dt_expr = solve(derivative_eq , diff(y , t))[ 0 ]

# 4. 代入具体数值求解
dx_dt_val = 1  # 底端速度
x_val = 6  # 底端距离
L_val = 10  # 梯子长度
y_val = sqrt(L_val ** 2 - x_val ** 2)  # 顶端高度 (y=8)

# 计算dy/dt
dy_dt_val = dy_dt_expr.subs({
    diff(x , t):dx_dt_val ,
    x:          x_val ,
    y:          y_val ,
    L:          L_val ,
    })
print(f"\n当x={x_val}米时, dy/dt = {dy_dt_val} 米/秒")

隐函数曲线绘制

绘制闭合隐函数曲线

闭合曲线在有限区域内形成封闭图形(如圆 )。需精确控制定义域以确保图形闭合,避免截断。

推荐方法:matplotlib.contour

优势:

  • 高效计算网格点,适合已知定义域的封闭图形
  • 可通过调整网格分辨率优化平滑度
  • 支持多曲线叠加绘制
代码语言:python
AI代码解释
复制
from __future__ import annotations

from typing import Callable , Tuple

import matplotlib.pyplot as plt
import numpy as np


def plot_closed_curve(
        equation: Callable[ [ np.ndarray , np.ndarray ] , np.ndarray ] ,
        x_range: Tuple[ float , float ] ,
        y_range: Tuple[ float , float ] ,
        levels: list ,
        resolution: int = 400 ,
        ) -> None:
    """
    绘制闭合隐函数曲线

    参数:
        equation: 隐函数方程 F(x, y) = 0
        x_range: x轴范围 (x_min, x_max)
        y_range: y轴范围 (y_min, y_max)
        levels: 等高线值列表(通常为[0])
        resolution: 网格分辨率(默认400)
    """
    # 生成网格
    x = np.linspace(x_range[ 0 ] , x_range[ 1 ] , resolution)
    y = np.linspace(y_range[ 0 ] , y_range[ 1 ] , resolution)
    X , Y = np.meshgrid(x , y)
    
    # 计算方程值
    Z = equation(X , Y)
    
    # 绘制等高线(F(x,y)=0)
    plt.contour(X , Y , Z , levels = levels , colors = 'blue' , linewidths = 2)
    plt.gca().set_aspect('equal')  # 保持纵横比
    plt.xlabel('x')
    plt.ylabel('y')
    plt.grid(True)
    plt.show()


if __name__ == "__main__":
    # 示例:绘制圆 x² + y² = 1
    plot_closed_curve(
            equation = lambda x , y:x ** 2 + y ** 2 - 1 ,
            x_range = (-1.5 , 1.5) ,
            y_range = (-1.5 , 1.5) ,
            levels = [ 0 ] ,
            )
闭合的隐函数曲线
闭合的隐函数曲线

绘制非闭合隐函数曲线

场景特点

非闭合曲线可能延伸至无穷远(如双曲线 ),定义域难以预设,需自适应计算边界。

推荐方法:sympy.plot_implicit

优势:

  • 自动适应曲线范围,无需预设定义域
  • 符号计算精确求解隐式方程
  • 支持复杂方程(如多分支曲线)
代码语言:python
AI代码解释
复制
from __future__ import annotations

from typing import Tuple

from sympy import Eq , plot_implicit , symbols
from sympy.plotting.plot import Plot


def plot_open_curve(
        equation: Eq ,
        adaptive: bool = True ,
        points: int = 500 ,
        x_range: Tuple[ float , float ] = (-5 , 5) ,
        y_range: Tuple[ float , float ] = (-5 , 5) ,
        ) -> Plot:
    """
    绘制非闭合隐函数曲线

    参数:
        equation: 符号方程 Eq(F(x,y), 0)
        adaptive: 是否启用自适应采样(默认开启)
        points: 采样点数(自适应关闭时生效)
        x_range: x轴范围(默认-5至5)
        y_range: y轴范围(默认-5至5)
    """
    # 自动调整范围避免截断
    p = plot_implicit(
            equation ,
            adaptive = adaptive ,
            points = points ,
            xlim = x_range ,
            ylim = y_range ,
            line_color = 'red' ,
            title = 'Non-closed Implicit Curve' ,
            )
    return p


if __name__ == "__main__":
    # 示例:绘制双曲线 x² - y² = 1
    x , y = symbols('x y')
    plot_open_curve(equation = Eq(x ** 2 - y ** 2 , 1))
非闭合隐函数曲线
非闭合隐函数曲线

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SymPy库解读
SymPy是一个用于符号数学计算的Python库。与传统的数值计算库不同,SymPy专注于处理符号表达式,使得用户能够进行符号计算、代数操作和解方程等任务。本教程将介绍SymPy库的基本概念、常见用法和高级功能,帮助读者更好地理解和使用SymPy。
Michel_Rolle
2024/02/01
4.2K0
python实现之一阶二阶导数
f'(x)=(x^3)‘+(4cosx)‘-(sin(π/2))‘=3x^2-4sinx-0
python与大数据分析
2022/03/11
6860
python实现之一阶二阶导数
数值积分法求解常微分方程
Scipy 的 integrate 模块的 odeint 函数可以用来以数值积分法求解常微分方程。
用户6021899
2023/03/03
6670
数值积分法求解常微分方程
手撸机器学习算法 - 线性回归
如果说感知机是最最最简单的分类算法,那么线性回归就是最最最简单的回归算法,所以这一篇我们就一起来快活的用两种姿势手撸线性回归吧;
HoLoong
2021/06/17
1.3K0
手撸机器学习算法 - 线性回归
自动微分(Automatic Differentiation)简介
http://blog.csdn.net/aws3217150/article/details/70214422 现代深度学习系统中(比如MXNet, TensorFlow等)都用到了一种技术——自动微分。在此之前,机器学习社区中很少发挥这个利器,一般都是用Backpropagation进行梯度求解,然后进行SGD等进行优化更新。手动实现过backprop算法的同学应该可以体会到其中的复杂性和易错性,一个好的框架应该可以很好地将这部分难点隐藏于用户视角,而自动微分技术恰好可以优雅解决这个问题。接下来我们将一
小爷毛毛_卓寿杰
2018/04/18
3.2K0
自动微分(Automatic Differentiation)简介
Scipy 高级教程——解决偏微分方程
Scipy 提供了强大的数值求解工具,其中包括解决偏微分方程(PDEs)的功能。在本篇博客中,我们将深入介绍 Scipy 中解决偏微分方程的方法,并通过实例演示如何应用这些工具。
Echo_Wish
2024/01/17
7630
Scipy 高级教程——解决偏微分方程
为什么数值仿真里要用RK4(龙格库塔法)
小跳最近在搭建一个数值仿真环境,由于需要用到python里面的一些库,所以不得不把simulink的模型搬过来,我们都知道在simulink里,仿真的时候设置仿真步长和微分方程求解器是必要的步骤。但是为什么要设置这个小跳却早已忘记了。
列夫托尔斯昊
2020/08/25
2.2K0
为什么数值仿真里要用RK4(龙格库塔法)
最小二乘法多项式曲线拟合原理与实现
概念 最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是曲线y=f(x)的近似曲线y= φ(x)。 原理 [原理部分由个人根据互联网上的资料进行总结,希望对大家能有用]
Angel_Kitty
2018/04/08
5.1K0
最小二乘法多项式曲线拟合原理与实现
《数据科学的数学必修课》第1讲 数学基础
笛卡尔:To be a data sciencist, it's crucial to learn some math!
SeanCheney
2023/01/02
8680
《数据科学的数学必修课》第1讲 数学基础
Python符号计算入门及隐函数图像绘制
感谢国防科大刘万伟老师提供了隐函数图像绘制的原始问题以及完美答案,我又补充了一点符号计算的基础知识。 >>> from sympy import * #定义符号 >>> x,y,z = symbols('x y z') >>> x x #定义表达式 >>> e = cos(x) + 1 #变量替换 >>> e.subs(x,z) cos(z) + 1 >>> e cos(x) + 1 >>> e = x**y >>> e x**y #变量替换 >>> e.subs(x, x**2) (x**2)**y >>
Python小屋屋主
2018/04/16
2.4K0
Python符号计算入门及隐函数图像绘制
以单变量函数为例进行导数定义的验证与计算
本文将以函数 x*sin(x) 在点 x = pi 处为例,展示如何用Python的SymPy库验证导数定义。
密码学人CipherHUB
2025/06/01
2760
以单变量函数为例进行导数定义的验证与计算
一阶常微分方程方向场图的绘制
方向场图可用于可视化一阶常微分方程的可能解。方向场图由XY平面网格中未知函数斜率的短线组成。y(x) 在XY平面上任意一点的斜率由微分方程
用户6021899
2023/03/03
1.5K0
一阶常微分方程方向场图的绘制
指数函数与对数函数的特性总结
密码学人CipherHUB
2025/06/10
3980
指数函数与对数函数的特性总结
Python数学可视化:显函数、隐函数及复杂曲线的交互式绘图
下面是一个使用Python实现显函数、隐函数及复杂曲线交互式绘图的完整解决方案。这个程序利用Matplotlib和NumPy进行数学可视化,并添加了交互控件让用户探索不同类型的数学函数。
hide
2025/07/01
1980
matplotlib 3D 绘图(一)
一、3D 曲线图 代码如下: import matplotlib as mpl from mpl_toolkits.mplot3d import Axes3D import numpy as np i
用户6021899
2019/08/14
7140
数值积分法求解常微分方程组
Scipy 的 integrate 模块的 odeint 函数也可以用来以数值积分法求解常微分方程组。下面的代码以 猎物-捕食者模型为例讲解其用法。
用户6021899
2023/03/03
7040
数值积分法求解常微分方程组
handcalcs,一个强大的 Python 库!
Github地址:https://github.com/connorferster/handcalcs
sergiojune
2024/05/17
2980
handcalcs,一个强大的 Python 库!
matlab求解微分方程组(matlab解微分方程的数值解)
其中,ydot为一个列向量,值分别表示y‘(1)、y‘(2)、y‘(3)的取值,t自因变量,y为因变量,一个y就可以表示因变量组了。事实上,说白了,这个函数就是申明一下变量使t和y,以及y一阶导的右端项为那三个。 接着,编写主函数如下:
全栈程序员站长
2022/08/01
2.2K0
matlab求解微分方程组(matlab解微分方程的数值解)
用Python学数学之Sympy代数符
说起数学计算器,我们常见的是加减乘除四则运算,有了它,我们就可以摆脱笔算和心算的痛苦。四位数以上的加减乘除在数学的原理上其实并不难,但是如果不借助于计算器,光依赖我们的运算能力(笔算和心算),不仅运算的准确度大打折扣,而且还会让我们对数学的运用停留在一个非常浅的层次。
py3study
2020/01/03
2.7K0
Scanpy可视化技巧--UMAP图优化
前几天后台有同学私信说想要美化下scanpy绘制的UMAP图,给了篇单细胞文章中的UMAP截图,我们写了一个函数,用于美化scanpy的UMAP图,思路还是比较简单,能让你的UMAP图拥有: ✓ 细胞亚群轮廓线 ✓ 智能标签定位 ✓ 科研风坐标轴 ✓ 自适应比例标注
生信大杂烩
2025/05/29
3720
Scanpy可视化技巧--UMAP图优化
相关推荐
SymPy库解读
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档