Python实现二分法、不动点迭代法、牛顿法
数值分析:Python实现二分法、不动点迭代法、牛顿法
一、问题定义
二、相关概念
三、方程求根的几种常用方法
1、二分法
2、不动点迭代法
3、牛顿法
题目:编写实现二分法求解方程 x^3-x-1=0与二分法、不动点迭代法、牛顿法求解方程 y=e^x+10x-2=0
代码实现:
import math
import numpy as np
import matplotlib.pyplot as plt
#待求解函数
def f(x):
y=x*x*x-x-1
#y=np.exp(x)+10*x-2
return y
#y=np.exp(x)+10*x-2的一阶导数
def df(x):
y=np.exp(x)+10
return y
#y=np.exp(x)+10*x-2的迭代公式
def phi(x):
y=(2-np.exp(x))/10.0
return y
#二分法
def erfen():
a = input("a = ") #左端点
b = input("b = ") #右端点
c = input("c = ") #预定精度
a = float(a) #强制转换为float类型
b = float(b)
c = float(c)
while(1):
plt.plot([a,b],[f(a),f(b)])
print (a,b)
x=(a+b)/2
if f(x)==0:
break
elif (f(x)*f(a)<0):
b=x
elif (f(x)*f(a)>0):
a=x
elif (a>b):
print ("a,b范围内无解")
if abs(a-b)<c:
break
print ("二分法估计解为:x = ",x)
#不动点迭代法
def FixPoint():
x0 = input("x0 = ")
x0 = float(x0)
espol=0.000001
while(1):
x1 = phi(x0)
print(x1)
if ((np.fabs(x1)<=1) & (float(np.fabs(x1-x0))<espol)):
break
elif ((np.fabs(x1)>=1) & (float(np.fabs(x1-x0)/np.fabs(x1))<espol)):
break
x0=x1
print("不动点迭代法估计解为:x = ", x1)
#牛顿法
def newton():
n=0
x0 = input("x0 = ")
x0 = float(x0)
espol = 0.000001
while (1):
x1 = x0-f(x0)/df(x0)
print(x1)
if ((np.fabs(x1) <= 1) & (float(np.fabs(x1 - x0)) < espol)):
break
elif ((np.fabs(x1) >= 1) & (float(np.fabs(x1 - x0) / np.fabs(x1)) < espol)):
break
x0 = x1
n = n + 1
if (n > 1000):
break
print("牛顿法估计解为:x = ", x1)
#draw
x = np.linspace(0,5,100) #给定x值的范围
plt.figure(figsize = (7,4)) #设置图的尺寸
plt.plot(x,f(x))
plt.axis([0.5,2,-5,+5]) #设置x,y坐标起始点
# 求解y=x*x*x-x-1时x坐标起始设置为(0.5,2)求解y=np.exp(x)+10*x-2x
坐标起始设置为(0,1)
plt.xlabel("x")
plt.ylabel("y")
plt.title("二分法")
plt.grid(True) #绘制网格
erfen() #调用二分法求解
#FixPoint() #调用不动点迭代法求解
#newton() #调用牛顿法求解
plt.show()