You are on page 1of 5

數值分析

第二次作業
Secant Method
課本第 113 頁,問題(3.7)(c)

組別: 第六組
學生: 陳器奇、謝鎮宇
學號:9301062a、9301035a
程式碼(使用 C++語言):

#include <stdio.h>
#include <math.h>

double f(double x) //說明(1)
{
return (-x*x*x)+x+1;
}

double SecantMethod(double xn_1, double xn, double e, int m) //說明(2)
{
int n;
double d;
for (n = 1; n <= m; n++) //說明(3)
{
d = (xn - xn_1) / (f(xn) - f(xn_1)) * f(xn); //說明(4)
if (fabs(d) < e)
return xn;
xn_1 = xn;
xn = xn - d;
printf("\n %15.15f, %15.15f ", xn,f(xn));
}
return xn;
}

int main(void) //說明(5)
{
double xm_1,xm,E;
int M;
printf("\n Enter 1st initial guess x0:"); //說明(6)
scanf("%lf", &xm_1);

printf(" Enter 2nd initial guess x1:");
scanf("%lf", &xm);

printf(" Enter Max iteration number:"); //說明(7)
scanf("%d", &M);

printf(" Enter tolerance:"); //說明(8)
scanf("%lf", &E);
printf("\n\n %15.15f \n", SecantMethod(xm_1, xm, E, M)); //說明(9)
return 0;
}

程式說明:

欲解方程式:−x3 + x + 1 = 0
Secant Method 解法方程式如下圖(圖 1)所式:

(圖 1)
Secant Method 持續執行直到以下兩個條件其中之一發生:
1. | xn + 1 − xn | < e
2. n > m

說明(1):宣告副程式函式 f 型別為雙精度浮點數,傳入值 x,回傳(-x*x*x)+x+1 計算後之
值。

說明(2):宣告副程式函式 SecantMethod 型別為雙精度浮點數,傳入值 xn_1, xn, e, m

說明(3):使用 For 迴圈疊代 m 次

說明(4):Secant Method 右式(圖 1)assign 給 d,如果 d 的絕對值小於 e(Tolerance,最小容
忍值),回傳 xn 的值。把 xn assign 給 xn_1,再把(xn-d) assign 給 xn(疊代置換 xn 與 xn_1
的值)。螢幕輸出 xn 及 f(xn)的值。

說明(5):主程式,宣告 xm_1,xm,E,M 的型別。

說明(6):輸入第一個和第二個起始猜測值 x0 及 x1。

說明(7):輸入最大疊代數目。

說明(8):輸入最小容忍值。

說明(9):螢幕顯示 SecantMethod 回傳值(SecantMethod 函式傳入值 xm_1, xm, E, M 計算後
之值)。

程式執行結果及討論:

[ 情況一 :改變 x0,x1 的相隔區間,固定最大疊代數為 50 及最小容忍值為 0.00001 ]

(1) x0:1.1 x1:1.2

Enter 1st initial guess x0:1.1
Enter 2nd initial guess x1:1.2
Enter Max iteration number:50
Enter tolerance:0.00001

1.358922558922559, -0.150559671163600
1.320488768042503, 0.017964933592940
1.324585858208551, 0.000563284561564
1.324718479412076, -0.000002226853110

1.324718479412076

結果 xn:1.324718479412076 疊代次數:4 f(x):-0.000002226853110

(2) x0:1.1 x1:50

Enter 1st initial guess x0:1.1
Enter 2nd initial guess x1:50
Enter Max iteration number:50
Enter tolerance:0.00001

1.100300953737658, 0.768208192751298
1.100601595747396, 0.767416608639056
1.392064837568101, -0.305540368252373
1.309066368705039, 0.065778557861840
1.323769415607835, 0.004041607148503
1.324731950018435, -0.000059674822552
1.324717944868202, 0.000000052781416

1.324717944868202

結果 xn:1.324717944868202 疊代次數:7 f(x):0.000000052781416

(3) x0:1.001 x1:1.002

Enter 1st initial guess x0:1.001
Enter 2nd initial guess x1:1.002
Enter Max iteration number:50
Enter tolerance:0.00001

1.497761334828597, -0.862150216342966
1.267734989017586, 0.230292162931523
1.316225660665854, 0.035930528277030
1.325189854921204, -0.002013355502200
1.324714202246012, 0.000016013635477

1.324714202246012

結果 xn:1.324714202246012 疊代次數:5 f(x):0.000016013635477

結論一 :從實驗(1)(2)(3),可得出一個可能趨勢,當固定最大疊代數及最小容忍值,起始
猜測值 x0 及 x1 的相隔區間越大時,f(x)的值越趨近零,也就是說 xn(解)精確度越高。

[ 情況二 :改變最小容忍值,固定最大疊代數為 50 及 x0,x1 的值各別為 1.1,1.2 ]
(4) 容忍值:0.01

Enter 1st initial guess x0:1.1
Enter 2nd initial guess x1:1.2
Enter Max iteration number:50
Enter tolerance:0.01

1.358922558922559, -0.150559671163600
1.320488768042503, 0.017964933592940

1.320488768042503

結果 xn:1.320488768042503 疊代次數:2 f(x):0.017964933592940

(5) 容忍值:0.000002

Enter 1st initial guess x0:1.1
Enter 2nd initial guess x1:1.2
Enter Max iteration number:50
Enter tolerance:0.000002

1.358922558922559, -0.150559671163600
1.320488768042503, 0.017964933592940
1.324585858208551, 0.000563284561564
1.324718479412076, -0.000002226853110

1.324718479412076

結果 xn:1.324718479412076 疊代次數:4 f(x):-0.000002226853110

(5) 容忍值:0.00000000000001

Enter 1st initial guess x0:1.1
Enter 2nd initial guess x1:1.2
Enter Max iteration number:50
Enter tolerance:0.00000000000001

1.358922558922559, -0.150559671163600
1.320488768042503, 0.017964933592940
1.324585858208551, 0.000563284561564
1.324718479412076, -0.000002226853110
1.324717957180461, 0.000000000274153
1.324717957244746, -0.000000000000000

1.324717957244746

結果 xn:1.324717957244746 疊代次數:6 f(x):-0.000000000000000

結論二 :從實驗(4)(5)(6),可得出一個可能趨勢,當固定最大疊代數及 x0,x1 的值,最小
容忍值越小時,f(x)的值越趨近零,也就是說 xn(解)精確度越高,相對的疊代次數也需要
越多。

由結論一及結論二可得出一個表格:
我們最後可以解出 xn 大約為 1.3247
以下為 f(x)的函式圖形,與我們解出來的 xn 值非常接近相符:

~完~感謝閱讀~