如果一个方程中同时包含变量x和y,且y不能解出为x的显式表达式,则称该方程确定了一个y关于x的隐函数。例如:x² + y² = 1。
即使y没有显式地表示为x的函数,我们仍然可以通过对方程两边关于x求导(注意:此时y是x的函数,所以遇到y时要用链式法则),然后解出dy/dx。
求隐函数x^{2}+y^{2}=9 的导数
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}')
相关变化率(滑动梯子问题):10m长的梯子靠墙下滑,底端以1m/s远离墙面。当底端离墙6m时,顶端下滑速度是多少?
设梯子底端到墙的距离为x(米),顶端高度为y(米),则x² + y² = 10²。
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
优势:
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
优势:
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 删除。