1. 程式人生 > >開放法求取方程的根

開放法求取方程的根

前言

之前我們討論了劃界法求取方程根(二分、試位),本次我們來討論開放法求取方程根(迭代法、牛頓切線法、弦截法),本次程式碼熬夜趕工,有不足之處希望給我指正,本篇內容今後還會修改,影象和流程圖會在以後補上。

 

補充

下面的所有判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)) ) )