若 f(x) 是一次可微且導函數連續的函數,
則牛頓求根法的迭代公式是
以下這個程式,將 和它的導函數 定義成兩個 C 語言函式 f() 和 df(), 然後用牛頓法求一個近似根。 程式中的所有浮點數都用雙精度,取 x0 = 0.5, 讓電腦迭代 10 次之後停下來,輸出每次的 xn。 這個程式需要數學函式。
#include <stdio.h> #include <math.h> /* 示範牛頓求根迭代法 (newton-iteration.c) */ #define STEP 10 double f(double); double df(double); main() { int n; double x; x = 0.5; for (n=0; n < STEP; ++n) { x = x - f(x)/df(x); printf("x_%-2d = %17.14f\n", n+1, x); } } double f(double x) { return sqrt(x) - cos(x); } double df(double x) { return 1/(2*sqrt(x)) + sin(x); }
若 f(x) 在 [a,b] 中連續,則可積。
梯形數值積分法 (trapezoidal rule) 是求定積分之近似值的一種方法,
其公式如下
以下這個程式,示範以梯形數值積分法求
#include <stdio.h> #include <math.h> /* 示範梯形數值積分法 (trapeziodal.c) */ #define STEP 16 double f(double); main() { int n, k, i; double h, T, a, b, x; T = 0; a = 0; b = 1; for (n=1, i=0; i < STEP; ++i) { n = 2*n; h = (b-a)/n; x = a; T = f(x)/2; for (k=1; k<n ; ++k) { x = x + h; T = T + f(x); } T = T + f(b)/2; T = h*T; printf("T_%-5d = %17.14f.\n", n, T); } } double f(double x) { return sqrt(1+x*x*x); }
任取一個正整數 p,令 x0 = p
且定義 Collatz 數列如下:
以下這個程式,為 Collatz 猜想做一些實驗。 我們依序取 p = 1,2,3,...,1000,對每一個 p, 定義 t(p) 是使得 xt(p) = 1 *熙怳p整數。例如若 p=1 則因為 x0=1 所以 t(1) = 0。 若 p=2 則因為 x0=2 然後 x1=1 所以 t(2) = 1。 若 p=3 則因為
x0=3 x1=10 x2=5 x3=16 x4=8 x5=4 x6=2 x7=1所以 t(3) = 7。依此類推。 以下這個程式,定義一個函式 collatz(),輸入正整數 p, 輸出整數 t(p),輸出每一對的 p 和 t(p),並輸出 t(p) 最大的情況。
#include <stdio.h> /* 示範 Collatz 猜想的實驗 (collatz.c) */ #define SIZE 1000 int collatz(int); main () { int p, tp, maxp, maxtp; maxp = maxtp = 0; for (p=1; p<=SIZE; ++p) { tp = collatz(p); printf("%4d: %4d\n", p, tp); if (tp > maxtp) { maxp = p; maxtp = tp; } } printf("for p=0..%d, max t(%d) = %d\n", SIZE, maxp, maxtp); } int collatz(int p) { int x=p, n=0; while (x != 1) { if (x%2 == 1) x = 3*x + 1; else x = x/2; ++n; } return n; }
習題
注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。
Created: Feb 24, 2001
Last Revised: Feb 25, 2001
© Copyright 2001 Wei-Chang Shann 單維彰