程式設計任務:編寫一個程式,計算任意正實數的自然對數,要求誤差不超過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')
複制