首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >隐函数求导与绘图

隐函数求导与绘图

原创
作者头像
密码学人CipherHUB
修改于 2025-06-06 03:17:42
修改于 2025-06-06 03:17:42
27100
代码可运行
举报
文章被收录于专栏:数理视界数理视界
运行总次数:0
代码可运行

什么是隐函数

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

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

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

示例代码

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

求隐函数x^{2}+y^{2}=9 的导数

代码语言:python
代码运行次数:0
运行
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
代码运行次数:0
运行
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} 米/秒")

隐函数曲线绘制

绘制闭合隐函数曲线

闭合曲线在有限区域内形成封闭图形(如圆 x^{2}+y^{2}=1 )。需精确控制定义域以确保图形闭合,避免截断。

推荐方法:matplotlib.contour

优势:

  • 高效计算网格点,适合已知定义域的封闭图形
  • 可通过调整网格分辨率优化平滑度
  • 支持多曲线叠加绘制
代码语言:python
代码运行次数:0
运行
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 ] ,
            )
闭合的隐函数曲线
闭合的隐函数曲线

绘制非闭合隐函数曲线

场景特点

非闭合曲线可能延伸至无穷远(如双曲线x^{2}-y^{2}=1 ),定义域难以预设,需自适应计算边界。

推荐方法:sympy.plot_implicit

优势:

  • 自动适应曲线范围,无需预设定义域
  • 符号计算精确求解隐式方程
  • 支持复杂方程(如多分支曲线)
代码语言:python
代码运行次数:0
运行
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验