当前位置:首页python > 正文

python中用matplotlib实现绘制二分法、牛顿法、弦截法图像

作者:野牛程序员:2023-07-25 20:44:56python阅读 2713

绘制二分法、牛顿法和弦截法的图像可以帮助直观地理解这些数值优化算法在函数最优化中的工作过程。一个简单的示例,使用Python中的Matplotlib库来绘制这三种方法在一个简单函数上的迭代过程。

首先,请确保已经安装了Matplotlib库。如果尚未安装,可以使用以下命令进行安装:

pip install matplotlib

接下来,将定义一个简单的函数,并实现二分法、牛顿法和弦截法来优化该函数。然后,使用Matplotlib来绘制每个方法的迭代过程。

下面是示例代码:

import numpy as np
import matplotlib.pyplot as plt

# 定义待优化的函数
def f(x):
    return x**3 - 3*x**2 + 2

# 二分法
def binary_search(a, b, tol=1e-5, max_iter=100):
    iterations = 0
    x = (a + b) / 2.0
    while abs(f(x)) > tol and iterations < max_iter:
        if f(a) * f(x) < 0:
            b = x
        else:
            a = x
        x = (a + b) / 2.0
        iterations += 1
    return x

# 牛顿法
def newton_method(x0, tol=1e-5, max_iter=100):
    iterations = 0
    x = x0
    while abs(f(x)) > tol and iterations < max_iter:
        x = x - f(x) / (3*x**2 - 6*x)
        iterations += 1
    return x

# 弦截法
def secant_method(x0, x1, tol=1e-5, max_iter=100):
    iterations = 0
    x = x1
    while abs(f(x)) > tol and iterations < max_iter:
        x_next = x - f(x) * (x - x0) / (f(x) - f(x0))
        x0 = x
        x = x_next
        iterations += 1
    return x

# 在指定范围内生成数据点用于绘制函数曲线
x_vals = np.linspace(-1, 4, 1000)
y_vals = f(x_vals)

# 设置初始猜测点
x0_binary = 0.5
x0_newton = 3.0
x0_secant = 0.5
x1_secant = 3.0

# 运行优化算法
opt_x_binary = binary_search(0, 2)
opt_x_newton = newton_method(x0_newton)
opt_x_secant = secant_method(x0_secant, x1_secant)

# 绘制函数曲线和优化算法迭代过程
plt.figure(figsize=(10, 6))
plt.plot(x_vals, y_vals, label='f(x) = x^3 - 3x^2 + 2')
plt.scatter(opt_x_binary, f(opt_x_binary), color='red', label='Binary Search')
plt.scatter(opt_x_newton, f(opt_x_newton), color='green', label='Newton Method')
plt.scatter(opt_x_secant, f(opt_x_secant), color='purple', label='Secant Method')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend()
plt.title('Optimization Algorithms: Binary Search, Newton Method, and Secant Method')
plt.grid(True)
plt.show()

这个示例代码会绘制函数 f(x) = x^3 - 3x^2 + 2 的图像,并标记出二分法、牛顿法和弦截法找到的最优解。请注意,对于不同的函数和初始猜测点,算法的表现可能会有所不同。这里仅供演示目的,实际应用时需要根据具体情况调整参数和初始点。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击