Skip to content

About

my notes for PythonNumberAnalysis Class

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

考试要背的代码

import math

# ==========================================
# 辅助函数(示例方程:x^3 - x - 1 = 0 及其导数)
# ==========================================

def f(x):
    """示例方程 f(x) = x^3 - x - 1"""
    return x**3 - x - 1

def df(x):
    """示例方程的一阶导数 f'(x) = 3x^2 - 1"""
    return 3 * x**2 - 1

def g(x):
    """不动点迭代的构造形式:x = (x + 1)^(1/3)"""
    return (x + 1)**(1/3)

# ==========================================
# 方法一:二分法 (Bisection Method)
# ==========================================

def bisection(f, a, b, tol=1e-6, max_iter=100):
    """
    二分法求根
    :param f: 目标函数
    :param a, b: 区间端点,需满足 f(a)*f(b) < 0
    :param tol: 精度控制
    :param max_iter: 最大迭代次数
    :return: 近似根
    """
    if f(a) * f(b) >= 0:
        raise ValueError("区间端点函数值必须异号!")
    
    for i in range(max_iter):
        mid = (a + b) / 2
        if f(mid) == 0 or (b - a) / 2 < tol:
            return mid
        if f(a) * f(mid) < 0:
            b = mid
        else:
            a = mid
    
    return (a + b) / 2

# ==========================================
# 方法二:不动点迭代法 (Fixed-Point Iteration)
# ==========================================

def fixed_point(g, x0, tol=1e-6, max_iter=100):
    """
    不动点迭代法求根
    :param g: 不动点迭代函数 x = g(x)
    :param x0: 初始猜测值
    :param tol: 精度控制
    :param max_iter: 最大迭代次数
    :return: 近似根
    """
    x = x0
    for i in range(max_iter):
        x_new = g(x)
        if abs(x_new - x) < tol:
            return x_new
        x = x_new
    return x

# ==========================================
# 方法三:牛顿法 (Newton's Method)
# ==========================================

def newton(f, df, x0, tol=1e-6, max_iter=100):
    """
    牛顿法求根
    :param f: 目标函数
    :param df: 目标函数的一阶导数
    :param x0: 初始猜测值
    :param tol: 精度控制
    :param max_iter: 最大迭代次数
    :return: 近似根
    """
    x = x0
    for i in range(max_iter):
        fx = f(x)
        if abs(fx) < tol:
            return x
        dfx = df(x)
        if dfx == 0:
            raise ZeroDivisionError("导数为零,牛顿法失效!")
        x_new = x - fx / dfx
        if abs(x_new - x) < tol:
            return x_new
        x = x_new
    return x

# ==========================================
# 方法四:弦截法 (Secant Method)
# ==========================================

def secant(f, x0, x1, tol=1e-6, max_iter=100):
    """
    弦截法求根(不需要导数)
    :param f: 目标函数
    :param x0, x1: 两个初始猜测值
    :param tol: 精度控制
    :param max_iter: 最大迭代次数
    :return: 近似根
    """
    for i in range(max_iter):
        f0 = f(x0)
        f1 = f(x1)
        if abs(f1) < tol:
            return x1
        if f1 - f0 == 0:
            raise ZeroDivisionError("分母为零,弦截法失效!")
        x2 = x1 - f1 * (x1 - x0) / (f1 - f0)
        if abs(x2 - x1) < tol:
            return x2
        # 更新变量(注意顺序)
        x0 = x1
        x1 = x2
    return x1

# ==========================================
# 测试运行
# ==========================================

if __name__ == "__main__":
    print("=== 数值求根方法测试 (方程: x^3 - x - 1 = 0) ===")
    print(f"精确解约等于: {1.324717957} \n")
    
    print(f"二分法结果: {bisection(f, 1, 2):.10f}")
    print(f"不动点迭代结果: {fixed_point(g, 1.5):.10f}")
    print(f"牛顿法结果: {newton(f, df, 1.5):.10f}")
    print(f"弦截法结果: {secant(f, 1, 2):.10f}")

About

my notes for PythonNumberAnalysis Class

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages