数值分析实验之非线性方程求根(Python 现)
作者:互联网
详细实验指导见上一篇,此处只写内容啦
实验内容:
1. 用二分法求方程x3-3x-1=0在的所有根.要求每个根的误差小于0.001.
提示与要求: (1) 利用精度找到迭代次数;
(2) 由f(x)=3(x2-1)可取隔根区间[-2,-1].[-1,1].[1,2]);
(3) 用程序求各隔根区间内的根.
2. 用不动点迭代求: (1)x3+2x2+10x-20=0的所有根.
或: (2)9x2-sinx-1=0在[0,1]上的一个根.
3. 用Newton迭代法求解下列之一,准确到10-5:
(1) x3-x-1=0的所有根;
(2) ex+2-x+2cosx-6=0位于[0,2]上的根.
实验代码:
• 牛顿迭代法
1 import math 2 x=0.5 3 n = 1 4 while n ==1 or abs(x-x1)>1e-5: 5 x1 = x 6 def F(x1): 7 return 2**-x+2*math.cos(x)+math.exp(x)-6 8 def F1(x1): 9 return math.exp(x)-math.log(2)*(2**-x)-2*math.sin(x) 10 x = x1 - F(x1)/F1(x1) 11 print ('迭代步数:',n,'X1计算值=',x1,'X计算值=',x) 12 n = n+1 13 else: 14 print('方程的根=',(x))
运行结果:
• 不动点法
1 import numpy as np 2 3 def f(x): 4 return 9*x**2 - np.sin(x) - 1 5 6 def g1(x): 7 return ((np.sin(x)+1)/9)**0.5 8 9 def g2(x): 10 result = (abs(2 * x + 1))**(1 / 5) 11 if (2 * x - 1) < 0: 12 return -result 13 return result 14 15 def getEpsilon(x, epsilon): 16 maxY = minY = x[0] 17 for each in x: 18 maxY = max(f(each), maxY) 19 minY = min((f(each), minY)) 20 epsilon = (maxY - minY) * epsilon 21 return epsilon 22 23 def getInitialVal(x, N, step, epsilon): 24 initalVal = [] 25 for i in range(N + 1): 26 y1, y2, y3 = f(x - step), f(x), f(x + step) 27 if (y1 * y2 < 0) and (i != 0): 28 initalVal.append((x + x - step) / 2) 29 if ((y2 - y1) * (y3 - y2) < 0) and (abs(y2) < epsilon): 30 initalVal.append(x) 31 x += step 32 33 return initalVal 34 35 def findFixedPoint(initalVal, delta,epsilon): 36 points = [] 37 for each in initalVal: 38 if (abs(g1(each)) < 1): 39 points.append(iteration(each, g1, delta,epsilon)) 40 else: 41 points.append(iteration(each, g2, delta,epsilon)) 42 return points 43 44 def iteration(p1, g, delta,epsilon): 45 while True: 46 p2 = g(p1) 47 err =abs(p2-p1) 48 relerr = err/(abs(p2)+epsilon) 49 if err<delta or relerr<delta: 50 return p2 51 p1 = p2 52 53 def main(): 54 a, b, c = input().split(' ') 55 a = float(a) 56 b = float(b) 57 c = int(c) 58 delta = 10 ** (-c) 59 N = 8 60 epsilon = 0.01 61 step = (b - a) / N 62 x = np.arange(a, b + epsilon, epsilon) 63 64 epsilon2 = getEpsilon(x,epsilon) 65 initalVal = getInitialVal(a, N, step, epsilon2) 66 ans = findFixedPoint(initalVal, delta,epsilon) 67 68 for each in ans: 69 print('方程的根为:%.6f' % each) 70 71 if __name__ == '__main__': 72 main()
运行结果:
标签:return,Python,epsilon,非线性,abs,each,x1,求根,def 来源: https://www.cnblogs.com/ynly/p/12894247.html