matlab math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/lecture_m... · 2014. 12. 24. ·...

18
多項式迴歸 解非線性方程式 數值積分、微分 ODE Matlab –Math tools

Upload: others

Post on 14-Oct-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

• 多項式迴歸

• 解非線性方程式

• 數值積分、微分

• 解ODE

Matlab –Math tools

Page 2: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

多項式回歸(regression):polyfit

• 找出最能夠代表x, y兩變數關係的n次多項式

– 假設x向量存有x變數的觀測資料,y向量有y變數的觀測資料,想要找出x與y之間的關係,統計上會使用回歸計算(regression)

p = polyfit(x, y, n)

– n=1,猜測x與y應該是線性相關,即y=ax+b, 結果回傳p向量會有兩個元素,p(1)為係數a,p(2)為係數b

– n=2,猜測x與y應該是二次項關係,即y=ax2+bx+c, 結果回傳p向量會有三個元素,p(1)=a,p(2)=b,p(3)=c

– 依此類推,p向量是用n次多項式axn+bxn-1+cxn-2+…回歸所得的係數,長度為n+1

• 求出回歸的n次多項式之後,可以用 polyval(p,x),以儲存在p向量的係數,算出此n次多項式在x向量各元素的值

Page 3: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

多項式回歸:範例

• 為了舉例方便,先製造一組x, y資料,各有100個資料點,x為0~10之間的100個隨機值,y=cos(x)但加上隨機的誤差值:

0 2 4 6 8 10-4

-3

-2

-1

0

1

2

3

x

y

x=rand(1,100)*10; %data points of x (random between 0 and 10) y=cos(x)+2*rand(1,100); % data points of y (cos(x) with random noise) plot(x,y,'*')

Page 4: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

多項式回歸:範例

• 接下來用線性(一次)、二次、三次多項式進行資料回歸,並且把回歸結果與原始資料點畫在同張圖上

0 2 4 6 8 10-4

-3

-2

-1

0

1

2

3

x

y

data

n=1 fit

n=2 fit

n=3 fit

p1=polyfit(x,y,1); p2=polyfit(x,y,2); p3=polyfit(x,y,3); xfit=0:0.1:10; yfit1=polyval(p1,xfit); yfit2=polyval(p2,xfit); yfit3=polyval(p3,xfit); plot(x,y,'*',xfit,yfit1,'r',xfit,yfit2,'g',xfit,yfit3,'k') legend('data','n=1 fit','n=2 fit', 'n=3 fit')

Page 5: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

解非線性方程式:fsolve

• 找出非線性方程F(x)=0的解

x = fsolve(@fun, x0)

• @fun:求解的非線性方程(F(x))

• x0:initial guess of solution

• x:F(x)=0的解

• 另外可以用optimset設定顯示疊代求解的過程

opt=optimset(‘Display’, ’iter’) x = fsolve(@fun, x0, opt)

(關於optimset的眾多設定,可參考指令說明)

Page 6: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

解非線性方程組:範例一

• 求解 猜測解為 x=1

•(直接傳入匿名函數)(只適用Matlab 2011b版本) >> y = @(x)x.^2+2*sqrt(x)-1 >> x = fsolve(y, 1) x = 0.2253

𝑥2 + 2 𝑥 − 1 = 0

Page 7: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

解非線性方程組:範例二

• 求解 猜測解為 x1= -5, x2= -5

• (利用自訂函數)開一個m檔,用function設定求解的函數,一個方程式為F的其中一個column

function F = myfun(x) F = [2*x(1) - x(2) - exp(-x(1)); -x(1) + 2*x(2) - exp(-x(2))]; • 在主程式(另一個m檔)或指令視窗,用@將自訂函數送入

fsolve指令求解,給定猜測值-5, -5,並設定顯示疊代過程 x0 = [-5; -5]; % starting guess opt=optimset('Display','iter'); x = fsolve(@myfun,x0,opt)

2𝑥1 − 𝑥2 − 𝑒

−𝑥1 = 0

−𝑥1 + 2𝑥2 − 𝑒−𝑥2 = 0

Page 8: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

After several iterations, fsolve finds an answer:

Norm of First-order Trust-region

Iteration Func-count f(x) step optimality radius

0 3 23535.6 2.29e+004 1

1 6 6001.72 1 5.75e+003 1

2 9 1573.51 1 1.47e+003 1

3 12 427.226 1 388 1

4 15 119.763 1 107 1

5 18 33.5206 1 30.8 1

6 21 8.35208 1 9.05 1

7 24 1.21394 1 2.26 1

8 27 0.016329 0.759511 0.206 2.5

9 30 3.51575e-006 0.111927 0.00294 2.5

10 33 1.64763e-013 0.00169132 6.36e-007 2.5

Equation solved.

fsolve completed because the vector of function values is near zero

as measured by the default value of the function tolerance, and

the problem appears regular as measured by the gradient.

x =

0.5671

0.5671

• 求解結果

Page 9: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

數值積分 • Matlab提供幾種常見的數值積分方法:

• 梯形法

– trapz(x)

– 用一次多項式直線逼近

• 適應式辛普森法 adaptive Simpson

– quad(x)

– 用二次多項式曲線逼近

• global adaptive quadrature

– integral(x)

– 自動判斷高階多項式逼近

Page 10: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

數值積分(1):梯形法trapz

Z = trapz(X, Y)

• X向量:在X座標上的分隔位置,

• Y向量:每個X位置的f(X)值

• Z變數:以梯形法計算f(X)在積分區間(X(1)=a~X(n)=b)的定積分結果

範例一(x,y為資料點) >> x=[0 10 20 30 40]; >> y=[0.5 0.7 0.9 0.6 0.4]; >> area1=trapz(x,y) area1 = 26.5000

範例二(y為x的函數) >> x=linspace(0,pi,25); >> y=sin(x); >> area2=trapz(x,y) area2 = 1.9971

Page 11: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

數值積分(2):辛普森法 quad

Z = quad(fun, a, b)

– fun是要積分的函數,a,b是積分區間,Z是積分結果

範例一(直接傳入匿名函數)(只適用Matlab 2011b版本) >> y=@(x) 1/(x^3-2x-5) >> Q = quad(y,0,2) Q = -0.4605

範例二(利用自訂函數) • 開一個m檔,用function設定要積分的函數

function y = myfun(x) y = 1./(x.^3-2*x-5); • 在主程式(另一個m檔)或指令視窗,用@將自訂函數送入quad指令

>> Q = quad(@myfun,0,2) Q = -0.4605

Page 12: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

數值積分(3):integral

Z = integral(fun, a, b)

– fun是要積分的函數,a,b是積分區間,Z是積分結果

– 可計算暇積分、積分下限接近奇異點singularity等狀況

範例:

𝑒−𝑥2𝑑𝑥

0

>> y = @(x) exp(-x.^2); >> Q = integral(y,0,Inf) Q = 0.8862

Page 13: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

數值微分:diff, gradient • dFdx = diff(F)./dx:

– forward difference計算一次微分

– diff(F)計算F向量前後兩個元素的差值

– 回傳結果dFdX向量會比F向量少一個元素

– dx是微分間距(可能是純量或向量)

• dFdx = diff(F,n)./(dx.^n) – forward difference計算n次微分

– diff(F,2) = diff(diff(F))

• dFdx = gradient(F, dx): – central difference一次微分

– F是一維向量,回傳結果dFdx的長度與F相同

• [dFdX, dFdY] = gradient(F, dx, dy) – 計算曲面的梯度向量

– F是裝有曲面資料的二維矩陣

– dFdX是X方向的微分,dFdY是Y方向的微分

𝛻𝐹(𝑥, 𝑦) =𝜕𝐹

𝜕𝑥𝑖 +𝜕𝐹

𝜕𝑦𝑗

𝑑𝐹(𝑥)

𝑑𝑥=𝐹 𝑥𝑖+1 − 𝐹(𝑥𝑖)

∆𝑥

𝑑𝑛𝐹(𝑥)

𝑑𝑥𝑛

𝑑𝐹(𝑥)

𝑑𝑥=𝐹 𝑥𝑖+1 − 𝐹(𝑥𝑖−1)

2∆𝑥

Page 14: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

數值微分範例: y=sin(x)的一次、二次微分

ni=100;

x=linspace(-pi,pi,ni);

dx=(2*pi)/((ni-1));

y=sin(x);

dy=gradient(y,dx);

ddy=gradient(dy,dx);

plot(x,y)

hold on

plot(x,dy,'r-')

plot(x,ddy,'k-')

legend('y=sin(x)','y''','y"')

hold off

Page 15: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

數值解常微分方程組(ODE):ode45

[t, X]=ode45(@fun, [t0,t1], X0) – t:產生時間向量

– X:solution矩陣,每一個column代表一個應變數對應到時間向量的變化值

– @fun:求解的ODE方程組

– [t0 t1]:積分時間區間

– X0:每個應變數初始值

𝑑𝑥1(𝑡)

𝑑𝑡= 𝑓1(𝑥1(𝑡), 𝑥2(𝑡), 𝑡)

𝑑𝑥2(𝑡)

𝑑𝑡= 𝑓2(𝑥1(𝑡), 𝑥2(𝑡), 𝑡)

𝑋(𝑡) = (𝑥1 𝑡 , 𝑥2 𝑡 )

𝐼. 𝐶. ∶ 𝑡 = 𝑡0, 𝑋 𝑡0 = (𝑥1 𝑡0 , 𝑥2 𝑡0 )

Page 16: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

解ODE方程組:範例

• 求解下列常微分方程式,畫出t=0 ~10時 x(t) 與 y(t) 的解:

• 步驟一:編輯ODE方程組的自訂函數(假設取名 myode.m):

𝑑𝑥(𝑡)

𝑑𝑡= 𝑥𝑐𝑜𝑠 𝑡 + 𝑦 sin 𝑡

𝑑𝑦(𝑡)

𝑑𝑡= −𝑥𝑠𝑖𝑛 𝑡 + 𝑦 cos 𝑡

𝐹 𝑡 = (𝑥 𝑡 , 𝑦 𝑡 )

𝐼. 𝐶. : 𝑡 = 0, 𝑥 0 = 0, 𝑦 0 = 1

function dFdt=myode(t,F) dFdt(1) = F(1)*cos(t)+F(2)*sin(t); dFdt(2) = -F(1)*sin(t)+F(2)*cos(t); dFdt = dFdt’; % change to column vector

Page 17: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

解ODE方程組:範例

• 步驟二,求解,畫出結果: 回到指令視窗或主程式(另一個.m檔),用ode45指令求出ODE方程組在時間0~10之間的解,初始值設定x=0, y=1 畫出x, y的時間變化序列,以及x-y平面上的phase diagram

-0.5 0 0.5 1 1.5 2 2.5-1

-0.5

0

0.5

1

1.5

2

2.5

x(t)

y(t

)

[t,F]=ode45(@myode, [0 10],[0 1]); x=F(:,1); y=F(:,2); plot(t,x,'r',t,y,‘g'); legend(‘x’,’y’); plot(x,y)

0 2 4 6 8 10-1

-0.5

0

0.5

1

1.5

2

2.5

t

x,

y

y1

y2

x y

Page 18: Matlab Math toolshomepage.ntu.edu.tw/~weitingc/fortran_lecture/Lecture_M... · 2014. 12. 24. · 多項式回歸:範例 • 為了舉例方便,先製造一組x, y資料,各有100個資料點,x

Matlab工具庫(Toolbox)

• Matlab有許多外掛或第三方開發的工具庫可以使用,很多都需要額外購買安裝。

• 開啟help window,左邊的列表會顯示目前有安裝的工具庫,點選之後會有使用說明、函數功能介紹、實際使用範例

• 學校/系上的Matlab可能會安裝的工具庫有:

• Bioinformatics

• Communications

• Control System

• Curve Fitting

• Filter Design

• Fixed-Point

• Image Processing

• Model Predictive Control

• Neural Network

• Optimization

• Parallel Computing

• Partial Differential Equation

• Robust Control

• Signal Processing

• Statistics

• Symbolic Math

• System Identification

• Wavelet