首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >立方根函数图像绘制与可导性验证

立方根函数图像绘制与可导性验证

原创
作者头像
密码学人CipherHUB
修改2025-05-31 15:12:16
修改2025-05-31 15:12:16
35200
代码可运行
举报
文章被收录于专栏:数理视界数理视界
运行总次数:0
代码可运行

在验证立方根函数可导性的过程中,我意外掉进了数值计算的深坑。本文将记录从错误可视化到正确分析的全过程,特别强调使用不同计算方法的图像差异。

问题背景

当我们需要验证函数f(x) = x^(1/3)在x=0处的可导性时,直观的思路是:

  1. 绘制函数图像观察曲线形态
  2. 计算导数并验证极限是否存在

但在实际编码中,第一步就栽了跟头——绘制出的图像竟不是真正的立方根曲线!

踩坑实录:三种方法绘图的巨大差异

我的Matplotlib绘图模板代码

代码语言:python
代码运行次数:0
运行
复制
from __future__ import annotations , annotations

from fractions import Fraction

import matplotlib.pyplot as plt
import numpy as np

# ==================== 1. 数据生成 ====================
x_begin = -10
x_end = 10
numbers_count = 5000
y_begin = -2.5
y_end = 2.5
title = 'x^(1/3)'
curve_name = 'x^(1/3)'
x_label = 'x-axis'
y_label = 'y-axis'
x = np.linspace(x_begin , x_end , numbers_count)

# 生成多个 y 函数(可根据需要添加/修改)
# 同时定义每个函数曲线的绘图风格
y_functions = {
    curve_name:{
        'data': xxxxxxxxx, # 实际函数计算的逻辑
        'style':{ 'color':'blue' , 'linestyle':'-' , 'linewidth':1 } ,
        } ,
    }

# ==================== 高亮标记配置 ====================
# 情况1:直接指定 (x, y) 坐标点
highlight_points = [
    (0 , 0) ,
    (1 , 1) ,
    (-1 , -1) ,
    ]

# ==================== 2. 创建画布和坐标系 ====================
fig , ax = plt.subplots(figsize = (10 , 6) , dpi = 100)

# ==================== 3. 绘制多条曲线 ====================
for curve_func in y_functions:
    y = y_functions[ curve_func ][ 'data' ]
    if 'style' in y_functions[ curve_func ]:
        style = y_functions[ curve_func ][ 'style' ]
        ax.plot(x , y , label = curve_func , **style)
    else:
        ax.plot(x , y , label = curve_func)

# ==================== 4. 添加高亮标记 ====================
if highlight_points:
    # 相当于将列表展开为: (0, 0), (np.pi/2, 1)
    # zip( (0, 0), (np.pi/2, 1) ) 会按列对齐元素,重组数据
    # 得到迭代器:
    # ( (0, np.pi/2), (0, 1) )
    x_cords , y_cords = zip(*highlight_points)
    ax.scatter(
            x_cords , y_cords ,
            color = 'red' , marker = 'o' , s = 100 ,
            edgecolor = 'black' , zorder = 10 ,
            label = 'Specific Points' ,
            )

# ==================== 5. 添加图表元素 ====================
ax.legend(loc = 'upper right')
ax.set_title(title , fontsize = 14 , pad = 20)
ax.set_xlabel(x_label , fontsize = 12)
ax.set_ylabel(y_label , fontsize = 12)

# ==================== 6. 自定义样式 ====================
ax.grid(True , linestyle = '--' , alpha = 0.6)
ax.set_xlim(x_begin , x_end)
ax.set_ylim(y_begin , y_end)
ax.tick_params(axis = 'both' , labelsize = 10)

# ==================== 7. 显示/保存 ====================
plt.tight_layout()
plt.show()

*在上述代码模板中,每次绘图时需要设置的参数如下图,

其中黄色框里面的代码片段是本次针对立方根函数绘图时需要特别注意的地方。

绘图时需要设置的部分
绘图时需要设置的部分

尝试1:直接使用指数运算符 x**(1/3)

直接使用指数运算符 `x**(1/3)`
直接使用指数运算符 `x**(1/3)`

问题表现

错误图像
错误图像

这张图像中:

  • x<0的部分出现巨大空档
  • Python输出RuntimeWarning:RuntimeWarning: invalid value encountered in power 'data': x ** (1 / 3) ,
  • 实际只绘制了x≥0部分的曲线

原因分析

Python在处理负数分数指数时:

  • 当分数指数为1/3(奇数分母)时,数学上应有实数解
  • 但Python的指数运算符默认返回复数值
  • Matplotlib无法绘制复数,导致负x值部分被跳过

尝试2:使用math.pow函数

pow(x, 1/3)
pow(x, 1/3)

问题表现

错误图像
错误图像

对每个x<0的值都抛出异常:

RuntimeWarning: invalid value encountered in power 'data': pow(x , 1 / 3) ,

原因分析:pow无法处理负数的分数次幂

正确做法:使用NumPy的专用立方根函数

numpy.cbrt
numpy.cbrt

效果

正确的图像
正确的图像

图中清晰显示:

  • x**(1/3)仅绘制了x≥0的部分曲线
  • math.pow方法导致程序崩溃,无法绘图
  • np.cbrt正确绘制整个实数域上的立方根曲线

函数绘图的建议

python 函数绘图最佳实践
python 函数绘图最佳实践

验证 x^(1/3)在 x=0 处是否可导

理论推导

纯数学推导
纯数学推导

代码实践

代码语言:python
代码运行次数:0
运行
复制
import sympy as sp
symbol_x = sp.symbols('x')
expr = symbol_x ** Fraction(1 , 3)
expr_prime = sp.diff(expr , symbol_x)
print(f'{sp.latex(expr)} 的导数函数是: {sp.latex(expr_prime)}')
right_limit = sp.limit(expr_prime , symbol_x , 0 , '+')
print(f'导数函数在 0 处的右极限为: {right_limit}')
left_limit = sp.limit(expr_prime , symbol_x , 0 , '-')
print(f'导数函数在 0 处的左极限为: {left_limit}')
zero_limit = sp.limit(expr_prime , symbol_x , 0 , '+-')
print(f'导数函数在 0 处于的极限为: {zero_limit}')
代码运行验证结果
代码运行验证结果

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题背景
  • 踩坑实录:三种方法绘图的巨大差异
    • 我的Matplotlib绘图模板代码
    • 尝试1:直接使用指数运算符 x**(1/3)
    • 尝试2:使用math.pow函数
    • 正确做法:使用NumPy的专用立方根函数
    • 函数绘图的建议
  • 验证 x^(1/3)在 x=0 处是否可导
    • 理论推导
    • 代码实践
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档