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