Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 39

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐẠI HỌC BÁCH KHOA


KHOA ĐIỆN

BÀI TẬP MATLAB


TOÁN NÂNG CAO

GVHD: TS. TRẦN THỊ MINH DUNG


Sinh viên thực hiện: ĐẶNG ĐÌNH ĐỨC
Mã sinh viên: 105200402
STT: 03

Đà Nẵng, tháng 11/2023


1. Code Matlab
clear; clc;
k = -2:0.1:2;
a = randi([1,10]);
k(1) = a;
for i =1 : length(k)
x(i) = k(i);
f(i) = x(i)^2;
d(i) = (-1)^(k(i)+1);
delta(i) = 2+(3/(2^(k(i)+1)));
x(i+1) = x(i) + d(i)*delta(i);
end
plot(k, f);
grid on;
ylim([-2 2]);
min_fx = min(f);
fprintf('giá trị min của hàm số f(x) là: %d\n', min_fx);
2. Kết quả mô phỏng
a. Hiện thị giá trị

b. Đồ thị
x
Bài tập: Converging f(x) = 2 with [a;b] = [ -0.6; 0.75] and ε =10−4
1+ x
%ham.m
function f = ham(x)
f =x/(1+x^2);
end

%hamgrad.m
function fgrad = hamgrad(x)
fgrad = (1-(x^2))/((1+x^2)^2);
end

%searching_alpha.m
a = -0.6; b= 0.75; e = 10^(-4);
m = (a+b)/2;
while 1
if a-b<0.001
break;

else
if hamgrad(m) == 0
break;
elseif ham(m)*ham(a) < 0
b= m;
elseif ham(m)*ham(b) < 0
a= m;
end
end
end

%if sqrt((a-b)^2) < e


%end

%main.m
clear; clc;
a= -2:0.001:5;
b = a/(1+a.^2);
for k = 1:1:10000
x(1)= 5;
y(1) = 5/26;
x(k+1)= x(k) + 0.075;
y(k+1) = x(k+1)/(1+x(k+1)^2);
plot(x,y);
end

Bài 1:
1. Code Matlab
% Định nghĩa hàm mục tiêu
fun = @(x) x(1) - x(2) + 2*x(1)^2 + x(2)^2;

% Gradient của hàm mục tiêu


gradient_fun = @(x) [1 + 4*x(1); -1 + 2*x(2)];

% Điểm bắt đầu


x0 = [0; 0]; % Chọn một điểm bất kỳ làm điểm bắt đầu

% Tham số của quy tắc Armijo


alpha = 0.1; % Hệ số giảm tỷ lệ (0 < alpha < 1)
beta = 0.5; % Hệ số giảm tỷ lệ (0 < beta < 1)

% Sử dụng gradient descent với quy tắc Armijo để tối ưu hóa hàm mục tiêu
max_iterations = 1000;
tolerance = 1e-6;

x = x0;
for iteration = 1:max_iterations
gradient = gradient_fun(x);
step_size = 1; % Kích thước bước ban đầu
while fun(x - step_size * gradient) > fun(x) - alpha * step_size
*norm(gradient)^2
step_size = step_size * beta; % Điều chỉnh kích thước bước theo quy
tắc Armijo
end
x = x - step_size * gradient;

% Kiểm tra điều kiện dừng


if norm(gradient) < tolerance
break;
end
end

% In kết quả
fprintf('Giá trị tối ưu của x là: %f\n', x(1));
fprintf('Giá trị tối ưu của y là: %f\n', x(2));

fprintf('Giá trị tối ưu của hàm mục tiêu là: %f\n', fun(x));
2. Kết quả

Bài 2.
1. Code Matlab
% Định nghĩa hàm mục tiêu
fun = @(x) x(1)^3 - 3*x(1)*x(2) + x(2)^3;

% Gradient của hàm mục tiêu


gradient_fun = @(x) [3*x(1)^2 - 3*x(2); -3*x(1) + 3*x(2)^2];

% Điểm bắt đầu


x0 = [0.5; 0.25]; % Chọn một điểm bất kỳ làm điểm bắt đầu

% Tham số của quy tắc Armijo


alpha = 0.1; % Hệ số giảm tỷ lệ (0 < alpha < 1)
beta = 0.5; % Hệ số giảm tỷ lệ (0 < beta < 1)

% Sử dụng gradient descent với quy tắc Armijo để tối ưu hóa hàm mục tiêu
max_iterations = 1000;
tolerance = 1e-6;

x = x0;
for iteration = 1:max_iterations
gradient = gradient_fun(x);
step_size = 1; % Kích thước bước ban đầu
while fun(x - step_size * gradient) > fun(x) - alpha * step_size *
norm(gradient)^2
step_size = step_size * beta; % Điều chỉnh kích thước bước theo quy tắc
Armijo
end
x = x - step_size * gradient;

% Kiểm tra điều kiện dừng


if norm(gradient) < tolerance
break;
end
end

% In kết quả
fprintf('Giá trị tối ưu của x là: %f\n', x(1));
fprintf('Giá trị tối ưu của y là: %f\n', x(2));
fprintf('Giá trị tối ưu của hàm mục tiêu là: %f\n', fun(x));

2. Kết quả

Bài 3
1. Code Matlab
clear;clc;
% Định nghĩa hàm mục tiêu
fun = @(x) x^3 - 6*x^2 + 9*x - 8;

% Đạo hàm (gradient) của hàm mục tiêu


gradient_fun = @(x) 3*x^2 - 12*x + 9;

% Điểm bắt đầu


x0 = 1; % Chọn một điểm bất kỳ làm điểm bắt đầu

% Tham số của quy tắc Armijo


alpha = 0.1; % Hệ số giảm tỷ lệ (0 < alpha < 1)
beta = 0.5; % Hệ số giảm tỷ lệ (0 < beta < 1)

% Sử dụng gradient descent với quy tắc Armijo để tối ưu hóa hàm mục tiêu
max_iterations = 1000;
tolerance = 1e-6;

x = x0;
for iteration = 1:max_iterations
gradient = gradient_fun(x);
step_size = 1; % Kích thước bước ban đầu
while fun(x - step_size * gradient) > fun(x) - alpha * step_size * gradient^2
step_size = step_size * beta; % Điều chỉnh kích thước bước theo quy tắc
Armijo
end
x = x - step_size * gradient;

% Kiểm tra điều kiện dừng


if abs(gradient) < tolerance
break;
end
end

% In kết quả
fprintf('Giá trị tối ưu của x là: %f\n', x);
fprintf('Giá trị tối ưu của hàm mục tiêu là: %f\n', fun(x));

2. Kết quả

Bài 4
1. Code Matlab
clear; clc;
% Hàm mục tiêu
fun = @(x) (x - 2)^2 + cos(x);
% Gradient của hàm mục tiêu
gradient_fun = @(x) 2*(x - 2) - sin(x);

% Điểm bắt đầu


x0 = 0; % Chọn một điểm bất kỳ làm điểm bắt đầu

% Tham số của quy tắc Armijo


alpha = 0.1; % Hệ số giảm tỷ lệ (0 < alpha < 1)
beta = 0.5; % Hệ số giảm tỷ lệ (0 < beta < 1)

% Sử dụng gradient descent với quy tắc Armijo để tối ưu hóa hàm mục tiêu
max_iterations = 1000;
tolerance = 1e-6;

x = x0;
for iteration = 1:max_iterations
gradient = gradient_fun(x);
step_size = 1; % Kích thước bước ban đầu
while fun(x - step_size * gradient) > fun(x) - alpha * step_size * gradient^2
step_size = step_size * beta; % Điều chỉnh kích thước bước theo quy tắc
Armijo
end
x = x - step_size * gradient;

% Kiểm tra điều kiện dừng


if abs(gradient) < tolerance
break;
end
end

% In kết quả
fprintf('Giá trị tối ưu của x là: %f\n', x);
fprintf('Giá trị tối ưu của hàm mục tiêu là: %f\n', fun(x));

2. Kết quả

Bài 5
1. Code Matlab
Clear; clc;
% hàm mục tiêu
fun = @(x) exp(x) - 3*x^2;

% Gradient của hàm mục tiêu


gradient_fun = @(x) exp(x) - 6*x;
% Điểm bắt đầu
x0 = 1; % Chọn một điểm bất kỳ làm điểm bắt đầu

% Tham số của quy tắc Armijo


alpha = 0.1; % Hệ số giảm tỷ lệ (0 < alpha < 1)
beta = 0.5; % Hệ số giảm tỷ lệ (0 < beta < 1)

% Sử dụng gradient descent với quy tắc Armijo để tối ưu hóa hàm mục tiêu
max_iterations = 1000;
tolerance = 1e-6;

x = x0;
for iteration = 1:max_iterations
gradient = gradient_fun(x);
step_size = 1; % Kích thước bước ban đầu
while fun(x - step_size * gradient) > fun(x) - alpha * step_size * gradient^2
step_size = step_size * beta; % Điều chỉnh kích thước bước theo quy tắc
Armijo
end
x = x - step_size * gradient;

% Kiểm tra điều kiện dừng


if abs(gradient) < tolerance
break;
end
end

% In kết quả
fprintf('Giá trị tối ưu của x là: %f\n', x);
fprintf('Giá trị tối ưu của hàm mục tiêu là: %f\n', fun(x));
2. Kết quả

Bài 6
1. Code Matlab
clear;clc;
% Hàm mục tiêu
fun = @(x) 2*x(1)*x(2) + 2*x(1) - x(1)^2 - 2*x(2)^2;
% Gradient của hàm mục tiêu
gradient_fun = @(x) [2*x(2) + 2 - 2*x(1); 2*x(1) - 4*x(2)];
% Điểm bắt đầu
x0 = [0; 0]; % Chọn một điểm bất kỳ làm điểm bắt đầu
% Tham số của quy tắc Armijo
alpha = 0.1; % Hệ số giảm tỷ lệ (0 < alpha < 1)
beta = 0.5; % Hệ số giảm tỷ lệ (0 < beta < 1)
% Sử dụng gradient descent với quy tắc Armijo để tối ưu hóa hàm mục tiêu
max_iterations = 1000;
tolerance = 1e-6;
x = x0;
for iteration = 1:max_iterations
gradient = gradient_fun(x);
step_size = 1; % Kích thước bước ban đầu
while fun(x - step_size * gradient) > fun(x) - alpha * step_size *
norm(gradient)^2
step_size = step_size * beta; % Điều chỉnh kích thước bước theo quy tắc
Armijo
end
x = x - step_size * gradient;
% Kiểm tra điều kiện dừng
if norm(gradient) < tolerance
break;
end
end
% In kết quả
fprintf('Gia tri toi uu cua x la: %f\n', x(1));
fprintf('Gia tri toi uu cua y la: %f\n', x(2));
fprintf('Gia tri toi uu cua ham muc tieu la: %f\n', fun(x));

2. Kết quả

Bài 7
1. Code Matlab
clear; clc;
% Hàm mục tiêu
fun = @(x) x(1) * x(2)^2;
% Gradient của hàm mục tiêu
gradient_fun = @(x) [x(2)^2; 2 * x(1) * x(2)];
% Điểm bắt đầu
x0 = [0.5; 0.25]; % Chọn một điểm bất kỳ làm điểm bắt đầu
% Tham số của quy tắc Armijo
alpha = 0.1; % Hệ số giảm tỷ lệ (0 < alpha < 1)
beta = 0.5; % Hệ số giảm tỷ lệ (0 < beta < 1)
% Sử dụng gradient descent với quy tắc Armijo để tối ưu hóa hàm mục tiêu
max_iterations = 1000;
tolerance = 1e-6;
x = x0;
for iteration = 1:max_iterations
gradient = gradient_fun(x);
step_size = 1; % Kích thước bước ban đầu
while fun(x - step_size * gradient) > fun(x) - alpha * step_size *
norm(gradient)^2
step_size = step_size * beta; % Điều chỉnh kích thước bước theo quy tắc
Armijo
end
x = x - step_size * gradient;
% Kiểm tra điều kiện dừng
if norm(gradient) < tolerance
break;
end
end
% In kết quả
fprintf('Giá trị tối ưu của x là: %f\n', x(1));
fprintf('Giá trị tối ưu của y là: %f\n', x(2));
fprintf('Giá trị tối ưu của hàm mục tiêu là: %f\n', fun(x));

2. Kết quả

Bài 1:
1. Code:
% Dinh nghia ham muc tieu
f = @(x)(x(1) - 4)^4 + (x(2) - 3)^2 + 4*(x(3) + 5)^4;

% Dinh nghia cac tham so ban dau


x0= [4;2;-1];

% Thiet lap tuy chon fminunc


options = optimoptions('fminunc', 'Display', 'iter',
'Algorithm', 'quasi-newton');

% Su dung fminunc de tim gia tri nho nhat


[x_min, fval] = fminunc(f, x0, options);
%[x_min, fval] = quasi-newton(f, x0, options);

% In ket qua
disp('gia tri nho nhat cua ham muc tieu:');
disp(fval);
disp('Gia tri x tuong ung:');
disp(x_min);

2. Kết quả :

Bài 2:
1. Code:
% Dinh nghia ham muc tieu f(x)
fun = @(x) 100*(x(1)^2 - x(2)^2)^2 + (x(1) - 1)^2;

% Khoi tao diem xuat phat (initial guess)


x0 = [0, 0];

% Toi uu hoa ham muc tieu


options = optimoptions('fminunc', 'Display', 'iter'); % Hien
thi ket qua toi uu
[x_opt, fval] = fminunc(fun, x0, options);

% Hien thi ket qua


fprintf('Giá tr? nh? nh?t c?a hàm m?c tiêu: %.4f\n', fval);
fprintf('?i?m t?i ?u: x1 = %.4f, x2 = %.4f\n', x_opt(1),
x_opt(2));

2. Kết quả :
Bài 3:
1. Code:
% Dinh nghia ham muc tieu f(x) va dao ham bac nhat f'(x)
fun = @(x) 0.5 * x^2 - sin(x);
df = @(x) x - cos(x);

% Dao ham bac 2 f''(x)


d2f = @(x) 1 + sin(x);

% Gia tri ban dau


x0 = 0.5;

% Dieu kien dung


epsilon = 1e-5;

% thiet lap vong lap


maxIter = 1000; % so lan lap toi da
iter = 0; % bien de dem so vong lap

% bat dau vong lap


while true
iter = iter + 1;

% tinh dao ham bac nhat va bac hai tai diem x0


f_prime = df(x0);
f_double_prime = d2f(x0);

% cap nhat x0 bang pp newton


x0 = x0 - f_prime / f_double_prime;

% tinh do chinh xac cua gia tri dao ham


accuracy = abs(f_prime);

% kiem tra dieu kien dung


if accuracy < epsilon || iter >= maxIter
break;
end
end

% ket qua toi uu


fval = fun(x0);
fprintf('gia tri nho nhat cua ham muc tieu: %.4f\n', fval);
fprintf('diem toi uu: x = %.4f\n', x0);
fprintf('so lan lap: %d\n', iter);

2. Kết quả :

Bài 4:
1. Code:
% Dinh nghia ham muc tieu f(x) va dao ham bac nhat f'(x)
fun = @(x) 0.5 * x^2 - sin(x);
df = @(x) x - cos(x);

% Dao ham bac 2 f''(x)


d2f = @(x) 1 + sin(x);

% Gia tri ban dau


x0 = 0.5;

% Dieu kien dung


epsilon = 1e-5;

% thiet lap vong lap


maxIter = 1000; % so lan lap toi da
iter = 0; % bien de dem so vong lap

% bat dau vong lap


while true
iter = iter + 1;

% tinh dao ham bac nhat va bac hai tai diem x0


f_prime = df(x0);
f_double_prime = d2f(x0);

% cap nhat x0 bang pp newton


x0 = x0 - f_prime / f_double_prime;

% tinh do chinh xac cua gia tri dao ham


accuracy = abs(f_prime);

% kiem tra dieu kien dung


if accuracy < epsilon || iter >= maxIter
break;
end
end

% ket qua toi uu


fval = fun(x0);
fprintf('gia tri nho nhat cua ham muc tieu: %.4f\n', fval);
fprintf('diem toi uu: x = %.4f\n', x0);
fprintf('so lan lap: %d\n', iter);

2 Kết quả :

Bài 5:
1 Code matlab :
% Hàm và ??o hàm
f = @(x) x + x.^(4/3);
df = @(x) 1 + (4/3)*x.^(1/3);

% Ch?n ?i?m b?t ??u


x0 = 1;

% S? l?n l?p
max_iter = 1000;

% ?? chính xác mong mu?n


tolerance = 1e-6;

% Ph??ng pháp Newton


x = x0;
for iter = 1:max_iter
% C?p nh?t
x_new = x - f(x) / df(x);
% Ki?m tra s? h?i t?
if abs(x_new - x) < tolerance
break;
end

% C?p nh?t giá tr? x


x = x_new;
end

% Hi?n th? k?t qu?


fprintf('Giá tr? x tìm ???c là: %f\n', x);
fprintf('Giá tr? hàm t?i x là: %f\n', f(x));
fprintf('S? l?n l?p: %d\n', iter);

2 Kết quả :

Bài 6:
1. Code:
% Dinh nghia ham muc tieu f(x)
fun = @(x) x^3 - 12*x^2 + 7*x^4 + 5*x + 42;

% Gia tri ban dau


x0 = 0;

% Toi uu hoa ham muc tieu su dung fminunc


options = optimoptions('fminunc', 'Display', 'iter'); % Hien
thi ket qua toi uu
[x_opt, fval] = fminunc(fun, x0, options);

% Hien thi ket qua


fprintf('Gia tri nho nhat cua ham muc tieu: %.4f\n', fval);
fprintf('Nghiem toi uu: x = %.4f\n', x_opt);
2. Kết quả :

Bài 7:
min f(x) = e x −3 x
function x_min = newton_minimization5(f, x0, epsilon)
% Đạo hàm bậc 1
f_1 = @(x) exp(x) - 3;

% Đạo hàm bậc 2


f_2 = @(x) exp(x);

x = x0;
while true
x_new = x - f_1(x) / f_2(x);

% Kiểm tra điều kiện dừng


if abs(x_new - x) < epsilon
break;
end

x = x_new;
end

x_min = x;
end

Chương trình:
clc;
clear;

% Hàm mục tiêu


f = @(x) exp(x) - 3*x;

% Điểm khởi tạo


x0 = 1;

% Ngưỡng dừng
epsilon = 1e-6;

% Tìm giá trị nhỏ nhất bằng phương pháp Newton


x_min = newton_minimization5(f, x0, epsilon);

% Kết quả
min_value = f(x_min);
min_point = x_min;
disp('Giá trị nhỏ nhất của hàm mục tiêu:');
disp(min_value);
disp('Điểm tới hạn:');
disp(min_point);

bài 8: f(x) = 2
x
[ ]
1 T 4 2
2 2
x−x
T −1
1 [ ] ( ) T
với x 0 =[ 0 , 0 ] và H 0 =I 2

% Hàm mục tiêu


f = @(x) (1/2) * x' * [4 2; 2 2] * x - x' * [-1 1]';

% Đạo hàm của hàm mục tiêu


grad_f = @(x) [4 2; 2 2] * x - [-1 1]';

% Ma trận xấp xỉ đạo hàm bậc hai ban đầu (chọn ma trận đơn
vị)
H = eye(2);

% Điểm khởi tạo


x0 = [0; 0];
x = x0;
vonglap = 0;

% Ngưỡng dừng
epsilon = 1e-6;

while vonglap < 0.1


% Tính gradient tại x
g = grad_f(x);

% Kiểm tra điều kiện dừng


if norm(g) < epsilon
break;
end
% Tính hướng tìm kiếm bằng công thức Quasi-Newton
d = -H * g;

% Tìm kiếm tối ưu trên đường thẳng bằng cách chọn alpha
alpha = 1; % Chọn alpha cố định, bạn có thể sử dụng các
phương pháp tìm kiếm dòng để tối ưu hóa alpha
x_new = x + alpha * d;

% Tính gradient tại x_new


g_new = grad_f(x_new);

% Tính a
a = alpha * d;

% Tính b
b = g_new - g;

% Cập nhật ma trận xấp xỉ đạo hàm bậc hai B theo công
thức Quasi-Newton (BFGS)
H = H + ((b - H*a) * (b - H*a)') / ((b - H*a)' * a);

% Cập nhật giá trị x


x = x_new;

vonglap = vonglap + 1;
end

% Kết quả
min_value = f(x);
min_point = x;
disp('Giá trị nhỏ nhất của hàm mục tiêu:');
disp(min_value);
disp('Điểm tối ưu:');
disp(min_point);
Bài tập: fminunc và fminsearch:
bài 1: min f(x) = 3 x 21+ 2 x 1 x 2 + x 22−4 x1 +5 x 2
clc; clear
fun = @(x)3*x(1)^2+2*x(1)*x(2)+x(2)^2-4*x(1)+5*x(2);
x0 = [1,1];
option = optimset('Display','iter','PlotFcns',@optimplotfval);
[x,fval] = fminunc(fun,x0,option)
title('');

Kết quả:

Bài 2: min f(x) = 1 00( x 2−x 21)2 +(1−x 1)2


options =
optimoptions('fminunc','Algorithm','trustregion','SpecifyObjectiveGradient',true)
;
x0 = [-1,2];
fun = @rosenbrockwithgrad;
x = fminunc(fun,x0,options)
function [f,g] = rosenbrockwithgrad(x)
% Calculate objective f
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;
if nargout > 1 % gradient required
g = [-400*(x(2)-x(1)^2)*x(1) - 2*(1-x(1));
200*(x(2)-x(1)^2)];
end
end
Kết quả:

2
2 ¿ |x|∨¿2
−¿|x|∨¿2+ ¿¿
Bài 3: f(x) = x e 20
1

Code:
% Initial guess
x0 = [1; 1];

% Define the objective function and its derivatives


fun = @(x) x(1)*exp(-norm(x)^2) + norm(x)^2/20;
grad = @(x) [exp(-norm(x)^2) - 2*x(1)*norm(x)^2*exp(-norm(x)^2); 2*x(2)/20];
hessian = @(x) [(-4*x(1)^2*norm(x)^2 + 2 - 4*x(1)^2*norm(x)^4*exp(-
norm(x)^2))*exp(-norm(x)^2), 0; 0, 2/20];

% Set tolerance and maximum number of iterations


tol = 1e-6;
max_iter = 100;

% Newton's method
for iter = 1:max_iter
% Evaluate objective function and its derivatives
f_val = fun(x0);
grad_f = grad(x0);

% Check for convergence


if abs(f_val) < tol
break;
end

% Update variables using Newton's method


delta_x = -hessian(x0) \ grad_f;
x0 = x0 + delta_x;
end

fprintf('Optimal solution: x = %f, y = %f\n', x0(1), x0(2));


fprintf('Objective value at optimum: %f\n', fun(x0));
2 Kết quả:

Bài tập chương 4:


min x 2+ y 2−2 x
Bài 1: -6y +14
x,y
St: x 2+ y 2−16=0
Code:
% Initial guess
x0 = [0; 0];

% Define the objective function and its derivatives


fun = @(x) x(1)^2 + x(2)^2 - 2*x(1) - 6*x(2) + 14;
grad = @(x) [2*x(1) - 2; 2*x(2) - 6];
hessian = @(x) [2, 0; 0, 2];

% Define the constraint function and its derivatives


constraint = @(x) x(1)^2 + x(2)^2 - 16;
constraint_grad = @(x) [2*x(1); 2*x(2)];

% Set tolerance and maximum number of iterations


tol = 1e-6;
max_iter = 100;

% Newton's method
for iter = 1:max_iter
% Evaluate objective and constraint functions and their derivatives
f_val = fun(x0);
g_val = constraint(x0);
grad_f = grad(x0);
grad_g = constraint_grad(x0);

% Check for convergence


if abs(f_val) < tol && abs(g_val) < tol
break;
end

% Update variables using Newton's method


delta_x = -hessian(x0) \ grad_f;
x0 = x0 + delta_x;
end

fprintf('Optimal solution: x = %f, y = %f\n', x0(1), x0(2));


fprintf('Objective value at optimum: %f\n', fun(x0));
fprintf('Constraint value at optimum: %f\n', constraint(x0));
Kết quả:

min
Bài 2: x , y √ xy

St: 20x +100y =200


Code:
% Hàm m?c tiêu
objective = @(x) -sqrt(x(1) * x(2));

% Ràng bu?c
A = [20, 10];
b = 200;

% ?i?m b?t ??u


x0 = [1; 1];

% Tính toán
options = optimoptions('fmincon', 'Display', 'iter',
'Algorithm', 'sqp');
[x, fval] = fmincon(objective, x0, A, b, [], [], [0; 0], [],
[], options);

% Hi?n th? k?t qu?


disp('Giá tr? t?i ?u:')
disp(-fval)
disp('Giá tr? c?a x và y t?i ?i?m t?i ?u:')
disp(x)

Kết quả:

min x + y + z
Bài 3:
x,y,z

St: x 2+ y 2+ z 2=1
Code:
% Define the objective function and its derivatives
fun = @(x) -(x(1) + x(2) + x(3));
grad = @(x) [-1; -1; -1];
% Define the constraint function and its derivatives
constraint = @(x) x(1)^2 + x(2)^2 + x(3)^2 - 1;
constraint_grad = @(x) [2*x(1); 2*x(2); 2*x(3)];

% Set tolerance and maximum number of iterations


tol = 1e-6;
max_iter = 100;

% Initial guess
x0 = [1; 0; 0];

% Lagrange multiplier method


for iter = 1:max_iter
% Evaluate objective and constraint functions and their derivatives
f_val = fun(x0);
g_val = constraint(x0);
grad_f = grad(x0);
grad_g = constraint_grad(x0);

% Check for convergence


if norm([grad_f; g_val]) < tol
break;
end

% Construct the KKT system matrix


A = [eye(3), grad_g; grad_g', 0];

% Solve the KKT system for the Newton step


delta = -A \ [grad_f; -g_val];

% Update variables using the Newton step


x0 = x0 + delta(1:3);
end
Kết quả:
Bài tập LP:
Bài 1: Max 50 x 1+120 x 2+40 x 3+80 x 4
s.t 2 x 1+ x 2+ x 3 ≤ 450
3 x 2+ x 3+ x 4 ≤ 180
4 x 1+ x 3 ≤ 400
x 1+ x 2+ x 4 ≤ 110
x 1, x 2, x 3, x 4 ≥ 0.
 Code
% Hệ số hàm mục tiêu
f = [-50; -120; -40; -80];

% Hệ số ràng buộc
A=[
2 1 1 0;
0 3 1 -1;
4 0 1 0;
1101
];

% Hằng số ràng buộc


b = [450; 180; 400; 110];

% Giới hạn biến


lb = zeros(4, 1);

% Giải bài toán tối ưu


[x, fval, exitflag, output] = linprog(f, A, b, [], [], lb);

% Hiển thị kết quả


disp('Kết quả tối ưu:');
disp(x);
disp(['Giá trị hàm mục tiêu tối ưu: ', num2str(-fval)]);
disp(['Exit Flag: ', num2str(exitflag)]);
 Kết quả mô phỏng
17 13
Bài 2: max x + x
6 1 10 2
x1 x2
s.t + ≤1
30 40
x1 x2
+ ≤1
30 25
x1 x2
+ ≤1
28 35
x 1, x 2 ≥ 0.
 Code

% Hệ số hàm mục tiêu


f = [-17/6; -13/10];

% Hệ số ràng buộc
A=[
1/30 1/40;
1/30 1/25;
1/28 1/35
];

% Hằng số ràng buộc


b = [1; 1; 1];

% Giới hạn biến


lb = zeros(2, 1);

% Giải bài toán tối ưu


[x, fval, exitflag, output] = linprog(f, A, b, [], [], lb);
% Hiển thị kết quả
disp('Kết quả tối ưu:');
disp(x);
disp(['Giá trị hàm mục tiêu tối ưu: ', num2str(-fval)]);
disp(['Exit Flag: ', num2str(exitflag)]);
 Kết quả mô phỏng

Bài 3: Min 3 x 1+ 2 x 2
St x 1≤12
x 1+ 3 x 2≤ 45
2 x 1+ x2 ≤ 30
x 1 , x 2≥0
 Code matlab
% Hệ số hàm mục tiêu
f = [3; 2];

% Hệ số ràng buộc
A=[
1 0;
1 3;
21
];

% Hằng số ràng buộc


b = [12; 45; 30];

% Giới hạn biến


lb = zeros(2, 1);

% Giải bài toán tối ưu


[x, fval, exitflag, output] = linprog(f, A, b, [], [], lb);

% Hiển thị kết quả


disp('Kết quả tối ưu:');
disp(x);
disp(['Giá trị hàm mục tiêu tối ưu: ', num2str(fval)]);
disp(['Exit Flag: ', num2str(exitflag)]);
 Kết quả mô phỏng

Bài 4:
Max 5x+12y
s.t 20x+10y ≤ 200
10x+20y ≤ 120
10x+30y ≤ 150
x≥0, y≥ 0
 code matlab
% Hệ số hàm mục tiêu
f = [-5; -12];

% Hệ số ràng buộc
A=[
20 10;
10 20;
10 30
];

% Hằng số ràng buộc


b = [200; 120; 150];

% Giới hạn biến


lb = zeros(2, 1);

% Giải bài toán tối ưu


[x, fval, exitflag, output] = linprog(f, A, b, [], [], lb);

% Hiển thị kết quả


disp('Kết quả tối ưu:');
disp(x);
disp(['Giá trị hàm mục tiêu tối ưu: ', num2str(-fval)]);
disp(['Exit Flag: ', num2str(exitflag)]);

 Kết quả mô phỏng

Bài 5: Max 750 x 1+1000 x 2


St x 1+ x2 ≤ 10
x 1+ 2 x 2≤ 15
4 x1 +3 x 2≤ 25
x 1≥0, x 2≥0

 Code matlab
% Hệ số hàm mục tiêu
f = [3; 2];

% Hệ số ràng buộc
A=[
1 0;
1 3;
02
];

% Hằng số ràng buộc


b = [12; 45; 30];

% Giới hạn biến


lb = zeros(2, 1);

% Giải bài toán tối ưu


[x, fval, exitflag, output] = linprog(f, -A, -b, [], [], lb);

% Hiển thị kết quả


disp('Kết quả tối ưu:');
disp(x);
disp(['Giá trị hàm mục tiêu tối ưu: ', num2str(fval)]);
disp(['Exit Flag: ', num2str(exitflag)]);

 Kết quả mô phỏng

Dùng fmincon giải bài tập:


Bài 1:
min f(x) = 100(x 2−x 21)2 + (1−x 1 )2

st: 0≤ x1 ≤0.5; 0.2≤ x 2 ≤0.8;(x 1−1/3)2 + (x 2−1/3)2 – (1/ 3)2 ≤ 0

Bài 2
Chọn bài tập 3 và 4 để vẽ hàm mục tiêu, vẽ hàm ràng buộc trong cùng figure:
2 2
*min f(x) = (x 1−4) + (x 2−6)
2
st: x1 ≤ x2
x 2 ≤4
2 2
*min (x 1−3) + (x 2−2)
2 2
st: x 1 +¿ x 2 ≤ 5

x 1+ x2 ≤3

x 1, x 2 ≥ 0

2 2
Bài 3 min f(x) = (x 1−4) + (x 2−6)
2
st: x1 ≤ x2
x 2 ≤4
2 2
Bài 4 min (x 1−3) + (x 2−2)
2 2
st: x 1 +¿ x 2 ≤ 5

x 1+ x2 ≤3

x 1, x 2 ≥ 0

Bài 5:
2 2
minf(x)= x 1+ x2
st −x 1−x 2+ 4 ≤ 0
−2 x 1−x 2+5 ≤ 0
fun = @(x) x(1)^2 + x(2)^2;
x0 = [0, 0];
A = [-1, -1; -2, -1];
b = [-4; -5];
Aeq = [];
beq = [];
lb = [];
ub = [];
x = fmincon(fun, x0, A, b, Aeq, beq, lb, ub);
disp('x=');
disp(x);

Bài 6:
2 2
minf(x)= x 1+ x2
2 2
st x .1 + x 2 ≤ 5
x 1+ 2 x 2=4
x1 ≥ 0 , x2 ≥ 0
fun = @(x) x(1)^2 + x(2)^2;
x0 = [0, 0];
Aeq = [1, 2];
beq = 4;
A = [];
b = [];
nonlcon = @circlecon;
lb = [0, 0];
ub = [];
options = optimoptions('fmincon', 'Display', 'iter', 'Algorithm', 'sqp');
x = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options);
disp('Optimal solution:');
disp(x);
disp('Objective function value at the optimal solution:');
disp(fun(x));
function [c, ceq] = circlecon(x)
c = x(1)^2 + x(2)^2 - 5;
ceq = [];
end

x 1−1 2 2
Bài 7: minf(x)= 2 ⅇ + ( x 2−x 1 ) + x 3

St x 1 x 2 x 3 ≤1
x 1+ x3 > c

x≥0
% Hàm mục tiêu
fun = @(x) 2 * exp(x(1) - 1) + (x(2) - x(1))^2 + x(3)^2;

x0 = [0, 0, 0];
A = [-1, 0, 0; 0, -1, 0; 0, 0, -1];
b = [-1; -1; -1];
Aeq = [1, 0, 1];
beq = 0;
nonlcon = @customConstraint;
lb = [0, 0, 0];
ub = [1, 1, 1];
options = optimoptions('fmincon', 'Display', 'iter', 'Algorithm', 'sqp');
x = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options);
disp('Optimal solution:');
disp(x);
disp('Objective function value at the optimal solution:');
disp(fun(x));
function [c, ceq] = customConstraint(x)
c = x(1) + x(2) + x(3) - 1;
ceq = [];
end

x 1+ 3 x 2 +3
Bài 8: min f ( x )=
2 x 1+ x 2 +6
2 x1 + x 2−12 ≤ 0
−x 1+ 2 x 2−4 ≤ 0

x1 , x2 ≥ 0

fun = @(x) (x(1) + 3*x(2) + 3) / (2*x(1) + x(2) + 6);

x0 = [0, 0];

A = [-2, -1; 1, -2];

b = [12; 4];

Aeq = [];

beq = [];

lb = [0, 0];

ub = [];

options = optimoptions('fmincon', 'Display', 'iter', 'Algorithm', 'sqp');

x = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, [], options);

disp('Optimal solution:');

disp(x);

disp('Objective function value at the optimal solution:');

disp(fun(x));

Bài 9:
min x 1
2 2
( x 1−1 ) + ( x 2−1 ) ≤ 1
2 2
( x 1−1 ) + ( x 2 +1 ) ≤1
fun = @(x) x(1);

x0 = [0, 0];

nonlcon = @(x) [

(x(1)-1)^2 + (x(2)-1)^2 - 1;

(x(1)-1)^2 + (x(2)+1)^2 - 1

];

Aeq = [];

beq = [];

lb = [];

ub = [];

options = optimoptions('fmincon', 'Display', 'iter', 'Algorithm', 'sqp');

[x, fval] = fmincon(fun, x0, [], [], Aeq, beq, lb, ub, nonlcon, options);

disp('Optimal solution:');

disp(x);

disp('Objective function value at the optimal solution:');

disp(fval);

You might also like