天天看點

程式與數學:應用泰勒展開式計算自然對數

程式設計任務:編寫一個程式,計算任意正實數的自然對數,要求誤差不超過0.001。

知識點:

① 自然對數的泰勒展開式;

② 計算泰勒展開式前n項的和;

③ 繪制自然對數和泰勒展開式函數圖像。

程式設計思路

應用自然對數的泰勒展開式進行計算,計算泰勒展開式前n項的和。程式設計的關鍵點是如何确定n?

自然對數函數ln(x),當x為正實數,且n趨向于無窮大時,自然對數函數的泰勒級數收斂于0。利用這個特征,在計算泰勒展開式前n項和的過程中,判斷目前項的值是否小于給定的一個極小值(如1e-10),若小于該值停止計算,否則繼續計算泰勒展開式的下一項。

自然對數函數的泰勒展開式

x的取值範圍不同,ln(x)的泰勒展開式也不同。考慮到簡單性,本程式僅計算x為正實數自然對數,其泰勒展開式為:

程式與數學:應用泰勒展開式計算自然對數

Python程式源代碼清單

import math
  
#計算泰勒展開式的最大前n項
max_n = 100000
  
# 計算ln(x)函數的泰勒展開式第n項的值
def taylor(n,x):
    value = (1/n)*(((x-1)/(x+1))**n)
    return value
     
  
# 傳回ln(x)泰勒展開式目前項數
def get_n():
    n=1
    while True:
        # 若目前項數大于max_n,計算結束
        if n > max_n:
            break
        yield n
        n=n+2
         
# 計算ln(x)函數
def ln(x):
    sum = 0
    for n in get_n():
        value = taylor(n,x)
        sum += value
        # 若目前項的值<1e-10,計算結束
        if value <= 1e-10:
            break
    return 2 * sum
     
  
# 程式入口
if __name__ == '__main__':
  
    x = float(input("請輸入一個正實數:\n"))
    print("ln函數計算值:%.3f" % ln(x))
    print("math.log函數計算值:%.3f" % math.log(x))
    
    繪制ln(x)圖像和ln(x)的泰勒展開式
           

複制

程式與數學:應用泰勒展開式計算自然對數

觀察上圖,ln(3)鄰域内泰勒展開式完全拟合了ln(x)函數曲線。圖中泰勒展開式取前10項,取的項數越多,拟合效果越好,函數值近似度越高。

下圖泰勒展開式取前3項,在ln(3)鄰域内的拟合效果就不是很好。

程式與數學:應用泰勒展開式計算自然對數

matlab程式源代碼清單

%{
繪圖:
(1)繪制ln(x)在區間[1,10]内的曲線
(2)繪制ln(x)在x=3鄰域内的泰勒展開式
目的:觀察泰勒展開式對函數的拟合
%}
  
% 繪制ln(x)函數曲線
% 區間[1,10]内建立100個點
x1 = linspace(1,10,100);
% 計算f(x)=log(x)函數的y坐标
y1 = log(x1);
% 繪制ln(x)函數曲線
plot(x1,y1)
hold on
  
% 繪制ln(x)在x=3鄰域内的泰勒展開式曲線
% 定義符号變量x,y,f
syms x y f;
% 定義自然對數函數
% ln(x)在matlab為log(x)
y = log(x);
% 應用matlab的taylor函數擷取log(3)泰勒展開式前10項
f = taylor(y,x,3,'order',10);
% log(3)鄰域内内建立100個點
t = linspace(2,4,100);
% 使用t替換符号變量
f1=subs(f,'x',t);
% 繪制泰勒展開式圖像
plot(t,f1,'.-r')
           

複制

程式與數學:應用泰勒展開式計算自然對數