若 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 單維彰