Tìm cực trị trong MATLAB( 2008a)


Trong MATLAB, bản 2008a trở về trước đó dùng thư viện symbolic của maple, các bản về sau thì dùng MuPad nên có đôi chút khác biệt.


syntax:

[xct,fct]=fminsearch(func,x0)

Mô tả:

  • fminsearch là hàm tìm cực tiểu của hàm tính toán số func, func có thể là hàm @ hoặc hàm inline.
  • x0 là giá trị dự đoán ban đầu.
  • giá trị mà tại đó hàm đạt cực tiểu sẽ được trả về xct
  • giá trị cực tiểu của hàm sẽ trả về fct, biến này có thể không có, sau khi tìm được xct ta có thể tính ngược ra fct

Cực trị hàm 1 biến

Ví dụ: tìm cực tiểu và cực đại của hàm x^3 -x^2-30x trong khoảng [-10 10]

func
Nhìn hình trên ta thấy rằng hàm này có 1 cực đại và 1 cực tiểu trong khoảng [-10 10].
Chương trình MATLAB tìm cực tiểu và cực đại của hàm trên như sau:
Bước đầu tiên là ta vẽ đồ thị của hàm số ra để xem cực tiểu, cực đại như thế nào, ở đâu.
Bước thứ 2 ta dùng hàm ginput để nhập giá trị ban đầu, gần cực tiểu thật để cho matlab có thể tìm ra được, ta nên chọn giá trị gần sát với cực tiểu, một số trường hợp chọn không tốt có thể làm cho thuật toán không hội tụ mà không tìm được.
Sau đó ta đưa giá trị ban đầu đó vào, phần việc còn lại là của fminsearch.
Cuối cùng là ta đưa kết quả ra cho người dùng.

clear all; close all; clc;
fx=@(x) x.^3-x.^2-30*x;
ezplot(fx,[-10 10]); hold on; grid on;
% Cực tiểu
[x0,y0]=ginput;
% Chính xác hóa
for k=1:length(x0)
[xct, fct]= fminsearch(fx,x0(k));
end
disp('Cực tiểu:'), [xct, fct]
%Tìm Cực đại
fx_cd=@(x) -(x.^3-x.^2-30*x);
[x0,y0]=ginput;
% chính xác hóa
for k=1:length(x0)
[xcd(k), fcd(k)]= fminsearch(fx_cd,x0(k));
end
disp('Cực đại:'), [xcd, -fcd]

Vì Matlab không có hàm tìm cực đại nên để tìm cực đại của f(x) ta sẽ tìm cực tiẻu của hàm -f(x), sau đó ta thay giá trị đó vào hàm thì ra giá trị cực đại của hàm đó, hoặc max(fx)=-min(-fx)
Tìm giá trị ta dự đoán từ đồ thị bằng lệnh ginput

Cực trị hàm nhiều biến:
Giờ ta xét hàm f(x,y)=(2 x^2+3 y^2)\times \exp{(-x^2-y^2)}

Tìm cực trị của hàm trên trong vùng D: 5 \ge x,y \ge -5
Vẽ nó trông không gian 3 chiều ta được như sau:

1

Trong miền D, hàm trên có 2 cực đại và 1 cực tiểu.

Chương trình dưới cũng làm nhiệm vụ tìm cực trị của hàm này bằng phương pháp đồ thị sau đó chính xác hóa lại kết quả.

Ở đây ta lưu ý một điều rằng, giá trị ban đầu đưa vào cho fminsearch phải dưới dạng vector nên hàm inline ta dùng sẽ là kiểu vector của x (nếu fminsearch chấp nhận nhiều giá trị ban đầu thì ta có thể dùng x,y chứ không cần dùng x(1), x(2) )

clear all; close all; clc;
[x,y]= meshgrid(-5:.15:5);
f=(2*x.^2+3*y.^2).*exp(-x.^2-y.^2);
[dfx, dfy]= gradient(f, .15,.15);
%tim cuc tri
figure(1); surf(x,y,f);
figure(2);
contour(x,y,f,5);hold on; %grid on;
contour(x,y,dfx, [0 0],'+r');
contour(x,y,dfy, [0 0],'-b');
%cuc tieu
[x0, y0]= ginput;
fxy=inline('(2.*x(1).^2+3.*x(2).^2).*exp(-x(1).^2-x(2).^2)', 'x');
for k=1:length(x0)
[xn(k,:), fn(k,:)]=fminsearch(fxy,[x0(k), y0(k)]);
end
disp('cuc tieu:'),[xn fn]
%cuc dai
[x0, y0]= ginput;
fxycd=inline('-(2.*x(1).^2+3.*x(2).^2).*exp(-x(1).^2-x(2).^2)', 'x');
for k=1:length(x0)
[xcd(k,:),fcd(k,:)] =fminsearch(fxycd,[x0(k), y0(k)]);
end

[xcd, -fcdr(:)]

 

câu lệnh:

<br />[x,y]= meshgrid(-5:.15:5);

lệnh meshgrid:

[x,y]=meshgrid(X,Y): với X,Y là các vector hàng, thì câu lệnh này sẽ tạo ra ma trận x với hàng đầu tiên chính là vector X, các hàng sau là copy của hàng này. số hàng của ma trận x chính là số phần tử của vector Y, tương tự như vậy cho ma trận y, nhưng đảo là cột: biến vector Y thành cột, sau đó các cột cảu ma trận y là copy của cột này, số cột của ma trận y mà số phần tử của vector X. meshgrid(x)=meshgrid(x,x)

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a free website or blog at WordPress.com.

Up ↑

mlcvGru

Random thoughts on Machine Learning, Deep Learning and (sometimes) Computer Vision

LazyT

Góc nhỏ của Quyền

phanlan

we get what we give, sống là cho đi

Codeaholicguy

software engineer, team lead at #kobiton, blogger at @codeaholicguy

Maths 4 Physics & more...

Blog Toán Cao Cấp (M4Ps)

Vatlyvietnam's Blog

Thế Giới Song Song

Darren Wilkinson's research blog

Statistics, computing, data science, Bayes, stochastic modelling, systems biology and bioinformatics

Ông Xuân Hồng

Chia sẻ kiến thức và thông tin về Machine learning

Từ coder đến developer - Tôi đi code dạo

Lập trình viên giỏi không phải chỉ biết code

Computational Biology and Molecular Modelling

An interface between biology, chemistry and computer science

Moriator - I can do it!

Linux dễ dàng hơn bạn nghĩ!

VinaCode

Lập trình & Cuộc sống

Blog của Chiến

Học. Thực hành. Sáng tạo

Bespoke Blog

Science! Culture! Computational Engines!

Vuhavan's Blog

Just another WordPress.com weblog

%d bloggers like this: