1-思想原理
求解一階的常微分方程ODE,歐拉想出一種數值方法,得到一種線性近似Linear approximation
他並非求解出具體的y的方程,而是根據給定的初始值\((x_0,y_0=f(x_0)\)求得下個想要求得的點\(x_n\)的函數值\(y_n=f(x_0)\),當然這樣就得到了想要的點的坐標\((x_n,y_n=f(x_n)\)。
那么他是怎么做的呢?
歐拉是利用倒數的幾何意義即斜率來求得下個點的坐標值
歐拉說 下個點的函數值近似等於 $$y_n = y_0 + \frac{dy}{dx}|_{x=x_0} * (x_n-x_0)$$
歐拉是借鑒了 這樣的一個事實: $$\frac{y_1-y_0}{x_1-x_0}=tan\alpha$$
歐拉說如果\(h=x_1-x_0\)足夠小,那么就結果值越精確
2-案例
下圖是一個example,初始值為(0,2),求得在區間[0,1]上的函數值,分成等長的四段,每段長0.25,這里就體現了線性近似(看結果圖)

對比圖

MATLAB 代碼
fun = @(x,y) (x+y);
% 歐拉近似值
re = euler_method(fun,0,2,1,0.25);
fprintf('result is %f\n',re);
% 准確值
xx = 0:0.25:1;
yy = 3*exp(xx)-xx-1;
plot(xx,yy,'b');
legend('Euler','Point','Exact');
% Euler Method
% f 表示一階常微分方程
% (x0,y0):初始值
% xn要求的函數值的自變量的值
% h 步長
function y = euler_method(f,x0,y0,xn,h)
n = round((xn-x0)/h);
y = y0;
x = x0;
xa = [];
xa(1) =x0;
re = [];
re(1) = y;
for i=1:n
y = y + h*f(x,y);
x = x + h;
% 保存段點值,用於繪圖
xa(i+1)=x;
re(i+1)=y;
end
plot(xa,re,'r');
hold on;%不清除畫面
scatter(xa,re,'*');% 描點
end
Result:


