python迭代法求解非线性方程_数值分析实验之非线性方程求根(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

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()

运行结果:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值