2013-10-27 48 views
0

我想在Maple Taylor系列中編寫cosinus函數。這裏是我的代碼:cosinus的泰勒級數返回錯誤的結果爲0

better_cos := proc (x) options operator, arrow; sum((-1)^n*x^(2*n)/factorial(2*n), n = 0 .. 20) end proc; 

better_cos(0)返回0而不是1(cos(0)== 1)。這可能是因爲X ^(2 * N)返回始終爲0而不是1。例如:

fun_sum := proc (x) options operator, arrow; sum(x^(2*n), n = 0 .. 0) end proc 

對於x == 0返回1

這很奇怪,因爲0^0返回1.你有什麼想法我怎麼才能正確實施泰勒系列的餘弦?

+0

哦,這是錯誤的。 0^0應該是未定義的。 – duffymo

+0

他們在學校教會了我,但維基百科說了別的:http://en.wikipedia。org/wiki/Exponentiation#Zero_to_the_power_of_zero;) – tch

回答

5

您應該能夠在better_cos運營商中使用add而不是sum獲得您想要的。

使用add通常更合適於累加有限數量的數字序列項,並且還要注意add具有Maple的所謂的特殊評估規則。

如果您打算獲取固定數量的術語(即n從0到20)的總和,那麼您不應該編寫計算每個輸入參數的階乘的過程(即每個值爲x) 。相反,只產生一次截斷的系列,然後使用unapply來生成一個運算符。這種方法也適用於處理原始問題,因爲使用了符號x,因此x^0項變爲1

您也可以重新排列多項式(截斷序列)以使其處於Horner形式,以便在隨後評估x的各種數值時嘗試並最小化算術步驟。

例如,使用5項爲簡潔,而不是20,你有它,

convert(add((-1)^n*x^(2*n)/factorial(2*n), n = 0 .. 5),horner); 

    /1 /1 / 1 /1  1  2\ 2\ 2\ 2\ 2 
1 + |- - + |-- + |- --- + |----- - ------- x | x | x | x | x 
    \ 2 \24 \ 720 \40320 3628800 //// 

bc := unapply(%,x): 

現在,您可以將程序bc如你所願,要麼符號或數字參數。

expand(bc(x)); 

     1 2 1 4 1 6  1 8  1  10 
    1 - - x + -- x - --- x + ----- x - ------- x 
     2  24  720  40320  3628800  

bc(0); 
          1 

bc(1.2); 
         0.3623577360 

如果你願意讓你的程序better_cos取一對的參數,使項數是可變的,那麼你仍然可以考慮使用add處理您原來的問題。例如,

bc := (x,N)->add((-1)^n*x^(2*n)/(2*n)!, n = 0 .. N): 

我想,這是一個家庭作業,而且你知道,你也可以使用現有的系統命令taylorseries得到相同的結果,即。

convert(series(cos(x),x=0,10),polynom); 

       1 2 1 4 1 6  1 8 
      1 - - x + -- x - --- x + ----- x 
       2  24  720  40320 

convert(taylor(cos(x),x=0,10),polynom); 

       1 2 1 4 1 6  1 8 
      1 - - x + -- x - --- x + ----- x 
       2  24  720  40320 
+0

+1僅適用於Horner。 – duffymo

2

這裏的泰勒級數定義:

enter image description here

不要從零開始的循環;用一個初始化並從兩個開始。

因子也是低效的。