C語言 例題3-1 利用 向前差 向後差 中央差 求f(x)=sin(x)的微分
#include <stdio.h>
#include <math.h>
double func(double x) // 欲微分函數
{return sin(x) ;}
double FordDiff(double x, double h, double(*fx)(double))
{// 前差微分
return ( fx(x+h) - fx(x) ) / h;
}
double BackDiff(double x, double h, double (*fx)(double))
{ // 後差微分
return ( fx(x) - fx(x-h) ) / h;
}
double MidDiff(double x, double h,double (*fx)(double))
{ // 中差微分
return 0.5 * ( fx(x+h) - fx(x-h) ) / h;
}
int main()
{
double x = 1.0, h=0.01, delta;
double ans = cos(x); // 答案
double cal;
cal = FordDiff(x, h, func), delta = cal - ans;
printf("FordDiff : %lf, delta = %lf\n",cal,delta);
cal = BackDiff(x, h, func), delta = cal - ans;
printf("BackDiff : %lf, delta = %lf\n",cal,delta);
cal = MidDiff(x, h, func), delta = cal - ans;
printf("MidDiff : %lf, delta = %lf\n",cal,delta);
return 0;
}
輸出畫面
FordDiff : 0.536086, delta = -0.004216
BackDiff : 0.544501, delta = 0.004198
MidDiff : 0.540293, delta = -0.000009
...Program finished with exit code 0
Press ENTER to exit console.
'''
Taylor Series 方式推導
(A) 前差法
(1) 先對 f(x) 以 Taylor series 對點 xi 做展開
f(x) = f(xi) + (x-xi) * f'(xi) / 1! + (x-xi)^2 * f''(xi) / 2! + ...
(2) x 以 xi+1 代入,令 x-xi = h
f(xi+1) = f(xi) + h * f'(xi) + h^2 * f''(xi) / 2! + ....
又 f(xi+1) 可寫成 f(xi + h),變成
f(xi+h) = f(xi) + h * f'(xi) + h^2 * f''(xi) / 2! + ....
(3) 只前兩項做近似
f(xi+h) = (fxi) + h * f'(xi)
f'(xi) = [f(xi+h) - f(xi)] / h
誤差以 Taylor series 第三項代表,
O(h) = h2 * f''(xi) / 2! = h2 * f''(xi) / 2
(B) 後差法
和前差法一樣的方式,只是將 x = xi-1、h = xi-1 - x 做替換,不再示範。
(C) 中央差法
(1) 對 x = xi 做展開式
f(x) = f(xi) + (x-xi) * f'(xi) / 1! + (x-xi)^2 * f''(xi) / 2! + ...
(2) x 以 xi+h 代入,令 x-xi = h,代入 (1)
f(xi+h) = f(xi) + (x-xi) * f'(xi) / 1! + (x-xi)2 * f''(xi) / 2! + (x-xi)3 * f (3次微分 (xi) / 3! + ...
f(xi+h) = f(xi) + h * f'(xi) / 1! + h2 * f''(xi) / 2! + h3 * f (3次微分(xi) / 3! + ...令為 a 式。
(3) x 以 xi-h 代入,令 xi - x = h,代入 (1)
f(xi-h) = f(xi) - h * f'(xi) / 1! + h2 * f''(xi) / 2! - h3 * f(3次微分(xi) / 3! + .... 令為 b 式。
(4) 連立 a, b 式 < 消掉 h2 >
f(xi+h) = f(xi) + h * f'(xi) / 1! + h2 * f''(xi) / 2! + h3 * f(3次微分(xi) / 3! + ... (a)
f(xi-h) = f(xi) - h * f'(xi) / 1! + h2 * f''(xi) / 2! - h3 * f(3次微分(xi) / 3! + .... (b)
(a) - (b) 再除 2 得到 [ f(xi+h) - f(xi-h) ] / 2 = h * f'(xi) + h3 * f(3次微分(xi) / 3! + ...
取前兩項得到 f'(xi) = [ f(xi+h) - f(xi-h) ] / 2h,
故最高誤差項約為 O(h) = h3 * f(3次微分'(xi) / 3! = h3 * f'(3次微分(xi) / 6
'''
訂閱:
張貼留言 (Atom)
2024_09 作業3 以Node-Red 為主
2024_09 作業3 (以Node-Red 為主 Arduino 可能需要配合修改 ) Arduino 可能需要修改的部分 1)mqtt broker 2) 主題Topic (發行 接收) 3) WIFI ssid , password const char br...
-
python pip 不是内部或外部命令 -- 解決方法 要安裝 Pyqt5 1. 首先,開啟命令提示字元。 2. 輸入 pip3 install pyqt5 好像不能執行 ! ! 錯誤顯示 : ‘ pip3 ’ 不是內部或外部命令、可執行的程式或批...
-
課程講義 下載 11/20 1) PPT 下載 + 程式下載 http://www.mediafire.com/file/cru4py7e8pptfda/106%E5%8B%A4%E7%9B%8A2-1.rar 11/27 2) PPT 下載...
-
• 認 識 PreFix、InFix、PostFix PreFix(前序式):* + 1 2 + 3 4 InFix(中序式): (1+2)*(3+4) PostFix(後序式):1 2 + 3 4 + * 後 序式的運算 例如: 運算時由 後序式的...
沒有留言:
張貼留言