開放法求取方程的根
阿新 • • 發佈:2018-12-03
前言
之前我們討論了劃界法求取方程根(二分、試位),本次我們來討論開放法求取方程根(迭代法、牛頓切線法、弦截法),本次程式碼熬夜趕工,有不足之處希望給我指正,本篇內容今後還會修改,影象和流程圖會在以後補上。
補充
下面的所有判0,嚴格意義上不應該是完全的0,應該改為1e-10或-1e-10,因為可能存在精度誤差,如果不判,那就把maxn的計數範圍跑完。
程式碼
1.迭代
# -*- coding: utf-8 -*- import math maxn = 99999 def f(x) : return x**3 - x - 1.0 def g(x) : return pow(x + 1, 1/3) def g_(x) : return 1/3 * pow(x + 1, -(2/3)) x = 1.5 if (math.fabs(g_(x)) < 1.0) : for i in range(maxn) : x = g(x) if (f(x) == 0) : break print("f(%.6lf) = %.3lf" %(x, f(x))) else : print("Can not output solution\n")
2.牛頓切線
# -*- coding: utf-8 -*- import math maxn = 9999 def f(x) : return math.exp(x) - 3 def f_(x) : return math.exp(x) x = -2 for i in range(maxn) : temp = f(x) if (temp > 0 and temp <= 1e-10) or (temp < 0 and temp >= -1e-10) : break x = x - f(x) / f_(x) print("f(%.5lf) = %.3lf\n" %(x, f(x) ) )
3.弦截
# -*- coding: utf-8 -*- import math maxn = 9999 def f(x) : return x**3 - 0.2 * x**2 - 1.2 def Y(x, a, b) : temp = f(b) return ((temp - f(a)) / (b - a)) * (x - b) + temp def f_(x) : return 3 * x**2 - 0.4 * x a = 1.0 b = 1.5 mid = (a + b) / 2 if (f_(a) > 0 and Y(mid, a, b) > f(mid)) or (f_(a) < 0 and Y(mid, a, b) < f(mid)) : for i in range(maxn) : temp = f(a) if (math.fabs(temp) <= 1e-5) : break a = a - (a - b) * temp / (temp - f(b)) ans = a else : for i in range(maxn) : temp = f(b) if (math.fabs(temp) <= 1e-5) : break b = b - (b - a) * temp / (temp - f(a)) ans = b print("f(%.5lf) = %.3lf\n" %(ans, math.fabs(f(ans)) ) )