假設給定x,求正弦函數sin(x) 的值時,可以利用泰勒級數公式:
來計算sin(x) 的值。
一般計算級數的某一項的絕對值小於指定的很小的量(如10-5)時,計算過程終止。
可以通過重複執行一系列計算來獲得近似答案,而每一次重複計算將產生一個更精確的答案,這種重複執行的過程稱為迭代。
迭代算法是用計算機解決問題的一種基本方法。它利用計算機運算速度快、適合做重複性操作的特點,讓計算機對一組指令(或一定步驟)進行重複執行,在每次執行這組指令(或這些步驟)時,都從變量的原值推出它的一個新值。
利用迭代算法解決問題,需要做好以下三個方面的工作:
(1)確定迭代變量
在可以用迭代算法解決的問題中,至少存在一個直接或間接地不斷由舊值遞推出新值的變量,這個變量就是迭代變量。
(2)建立迭代關係式
所謂迭代關係式,指如何從變量的前一個值推出其下一個值的公式(或關係)。迭代關係式的建立是解決迭代問題的關鍵,通常可以使用遞推或倒推的方法來完成。
(3)對迭代過程進行控制
在什麼時候結束迭代過程?這是編寫迭代程序必須考慮的問題。不能讓迭代過程無休止地重複執行下去。
迭代過程的控制通常可分為兩種情況:
一種是所需的迭代次數是個確定的值,可以計算出來;
另一種是所需的迭代次數無法確定。
對於前一種情況,可以構建一個固定次數的循環來實現對迭代過程的控制;對於後一種情況,需要進一步分析出用來結束迭代過程的條件。
具體使用迭代法求根時應注意以下兩種可能發生的情況:
(1)如果方程無解,算法求出的近似根序列就不會收斂,迭代過程會變成死循環,因此在使用迭代算法前應先考察方程是否有解,並在程序中對迭代的次數給予限制;
(2)方程雖然有解,但迭代公式選擇不當,或迭代的初始近似根選擇不合理,也會導致迭代失敗。
本題用迭代算法計算sinx的值,計算方法是逐一計算級數的一個項的值,每計算一項就將其累加起來,直到某項的絕對值小於給定的量,計算終止。
求解這個問題需要注意兩個方面:每項的計算量和符號問題。
觀察相鄰兩項的關係,假設前一項是xn/n!,存儲在item變量中,則後一項的值為:xn+2/(n+2)!。為了減少計算工作量,可以利用前一項item的值,計算後一項的值為:item *x*x/((n+1)*(n+2))。
各項正負號:第1項不用計算,且符號為正。從第2項開始,均是前一項的符號乘以-1。
一般習慣輸入角度,而泰勒級數公式中的x是弧度,所以要進行變換,並且將其換算到360度以內,以加快計算速度。
//求sinx的參考源程序
#include <stdio.h>
#include <math.h>
int main(void)
{
int n=1, sign=-1;
double x,sinx,item;
printf("Input degree:");
scanf("%lf",&x);
while(x>360)
{
x=x-360; //讓其值在0~360
}
x=x*3.14159/180; //轉換成弧度
sinx=x;
item =x;
do
{
item = item *x*x/((n+1)*(n+2));
sinx=sinx+sign* item;
n=n+2;
}while(fabs(item)>=1e-5);
printf("sin(x)=%.1f \n",sinx);
return 0;
}
運行結果:
Input degree:30
sin(x)=0.5
----