Python 实现数值分析二分法,牛顿法,不动点法解方程

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

画图像

x = np.linspace(1.5, 3, 1000)
y = x**3-3*x-2
plt.figure(figsize=(8,4))
plt.plot(x,y,color="blue",linewidth=2)
plt.xlabel("x")
plt.ylabel("y")

目标函数

# 数值求函数值
def solve_function(x):
    return x**3-3*x-2

二分法

# 二分法求根
def dichotomy(left, right,eps):
    middle = (left+right)/2
    count=0 # 统计迭代次数
    while abs(solve_function(middle))>eps:
        middle = (left+right)/2
        if solve_function(left)*solve_function(middle)<=0:
            right=middle
        else:
            left=middle
        count=count+1
    return count,middle

执行二分法

left=1.5
right=3
eps=0.00001
count,middle=dichotomy(left, right,eps)
print("迭代%d次得到的根是%f" %(count,middle))

函数的导数

def solve_derivatives(x):
    return 3*x**2-3

牛顿法求根

# Newton's method
def Newton(x,eps):
    count=0
    while abs(solve_function(x))>eps:
        x=x-solve_function(x)/solve_derivatives(x)
        count=count+1
    return count,x

执行牛顿法、

x=3
eps=0.0001
count,middle=Newton(x,eps)
print("迭代%d次得到的根是%f" %(count,middle))
# 不动点法求根
def Fixed_Point(x,eps):
    count=0
    while abs(solve_function(x))>eps:
        x= (3*x+2)**(1/3)
        count=count+1
    return count,x
x=3
eps=0.0001
count,middle=Fixed_Point(x,eps)
print("迭代%d次得到的根是%f" %(count,middle))
# 计算多个精度的迭代次数
N=11 #精度,小数点位数
epss=[0.1**x for x in range(1,N)]
left=1.5
right=3
Binary_count=[]
Newton_count=[]
FixedPoint_count=[]
for eps in epss:
    count,ans=dichotomy(left, right,eps)
    Binary_count.append(count)
    count,ans=Newton(right,eps)
    Newton_count.append(count)
    count,ans=Fixed_Point(right,eps)
    FixedPoint_count.append(count)
# 画图比较三种方法的性能
number=[x for x in range(1,N)]
plt.figure(figsize=(8,6))
line1,=plt.plot(number,Binary_count, label="Line 1",color="red",linewidth=2)
line2,=plt.plot(number,Newton_count, label="Line 2",color="blue",linewidth=2)
line3,=plt.plot(number,FixedPoint_count, label="Line 3",color="green",linewidth=2)
l1 = plt.legend([line1, line2,line3], ["Binary", "Newton","FixedPoint"], loc='upper left')
plt.xlabel("-lg(error)")
plt.ylabel("iterations")

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/82757894