如何在SymPy或Matplotlib中绘制函数图像与牛顿迭代点?
解决方案
一、Matplotlib实现(解决字符串转函数错误)
你遇到的错误核心是:字符串里的三角函数默认调用了Python内置的math.sin/math.cos,这类函数不支持数组运算;另外要彻底把^替换成**(^是Python位运算符,不是幂运算)。以下是可行步骤:
1. 导入依赖库
import numpy as np import matplotlib.pyplot as plt
2. 正确转换函数字符串
把字符串里的三角函数替换为numpy版本,再转为可调用函数:
# 确保函数字符串用**做幂运算 func_str = "x**2*sin(x)*cos(x)" # 替换为numpy支持的三角函数 func_str_np = func_str.replace("sin", "np.sin").replace("cos", "np.cos") # 转为能处理数组的函数 f = lambda x: eval(func_str_np)
3. 绘制函数与迭代点
# 生成函数图像的x轴数据 x = np.linspace(0, 2, 1000) y = f(x) # 牛顿法迭代点列表 guess = [1.63334806538257, 1.57496329804422, 1.57081816486420, 1.57079632740207, 1.57079632679490, 1.57079632679490] # 计算迭代点对应的y值 guess_y = f(np.array(guess)) # 绘图 plt.figure(figsize=(10, 6)) plt.plot(x, y, label=r'$f(x) = x^2\sin(x)\cos(x)$', color='blue') # 给每个迭代点加标记,区分顺序 for i, (gx, gy) in enumerate(zip(guess, guess_y)): plt.scatter(gx, gy, s=60, label=f'迭代点{i+1}', alpha=0.8) plt.xlabel('x') plt.ylabel('f(x)') plt.title('牛顿法迭代点与函数图像') plt.legend() plt.grid(True) plt.show()
二、SymPy实现(直接在SymPy图中添加迭代点)
SymPy的绘图可以结合自身plot函数和Matplotlib的散点功能,步骤如下:
1. 导入库并定义符号函数
import sympy as sp import numpy as np import matplotlib.pyplot as plt # 定义符号变量 x = sp.symbols('x') # 定义目标函数 f_sym = x**2 * sp.sin(x) * sp.cos(x)
2. 转换为数值函数
# 把SymPy符号函数转为能计算数值的函数 f_numeric = sp.lambdify(x, f_sym, 'numpy')
3. 绘制函数并叠加迭代点
# 先绘制函数图像,不直接显示 p = sp.plot(f_sym, (x, 0, 2), show=False, label=r'$f(x) = x^2\sin(x)\cos(x)$') # 计算迭代点的y值 guess = [1.63334806538257, 1.57496329804422, 1.57081816486420, 1.57079632740207, 1.57079632679490, 1.57079632679490] guess_y = f_numeric(np.array(guess)) # 获取SymPy绘图背后的Matplotlib轴对象,添加散点 ax = p._backend.ax for i, (gx, gy) in enumerate(zip(guess, guess_y)): ax.scatter(gx, gy, s=60, label=f'迭代点{i+1}', alpha=0.8) # 完善图表样式 ax.set_xlabel('x') ax.set_ylabel('f(x)') ax.set_title('牛顿法迭代点与函数图像') ax.legend() ax.grid(True) # 显示最终图像 p.show()
内容的提问来源于stack exchange,提问作者dannypancakes
相关产品推荐
相关产品推荐

