You are on page 1of 8

TNC chương 4

Học và tên : Nguyễn Sơn Tùng

Nhóm HP : 20.36

Bài 1
clear; clc; close all;

% Định nghĩa hàm mục tiêu


fun = @(x) 100 * (x(2) - x(1)^2)^2 + (1 - x(1))^2;

% Khởi tạo điểm bắt đầu


x0 = [0.25, 0.25]; % Điểm bắt đầu tùy ý

% Định nghĩa ràng buộc bất bình thường (inequality constraints) g(x) <= 0
A = [];
b = [];

% Định nghĩa ràng buộc bình thường (equality constraints) h(x) = 0


Aeq = [];
beq = [];

% Định nghĩa giới hạn cho biến tối ưu hóa


lb = [0, 0.2];
ub = [0.5, 0.8]; % Chú ý: Sửa giá trị của `ub`

options = optimoptions('fmincon', 'Algorithm', 'interior-point', 'Display',


'iter'); % Sửa Algorithm thành 'interior-point' và hiển thị quá trình tối ưu

% Sử dụng fmincon để tối ưu hóa


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

disp('Kết quả tối ưu:');


disp(x);

% Tạo một lưới điểm để vẽ đồ thị hàm mục tiêu và ràng buộc
x1 = linspace(0, 0.5, 100);
x2 = linspace(0.2, 0.8, 100);
[X1, X2] = meshgrid(x1, x2);
Z = 100 * (X2 - X1.^2).^2 + (1 - X1).^2;

% Vẽ đồ thị hàm mục tiêu


figure;
contour(X1, X2, Z, 100);
hold on;

% Vẽ ràng buộc
circle = @(x1, x2) (x1 - 1/3).^2 + (x2 - 1/3).^2 - (1/3)^2;
contour(X1, X2, circle(X1, X2), [0 0], 'r', 'LineWidth', 2);

% Đánh dấu điểm tối ưu


plot(x(1), x(2), 'ro', 'MarkerSize', 10);
xlabel('x1');
ylabel('x2');
title('Đồ thị hàm mục tiêu và ràng buộc');
legend('Hàm mục tiêu', 'Ràng buộc', 'Điểm tối ưu');
hold off;
% Tính giá trị của hàm mục tiêu tại điểm tối ưu
optimal_fval = fun(x);

% Hiển thị giá trị tối ưu của hàm mục tiêu


disp(['Giá trị tối ưu của hàm mục tiêu: ', num2str(optimal_fval)]);

function [c, ceq] = circlecon(x)


c = (x(1) - 1/3)^2 + (x(2) - 1/3)^2 - (1/3)^2;
ceq = [];
end

Bài 2
clear; clc; close all;

% Định nghĩa hàm mục tiêu


fun = @(x) (x(1) - 4)^2 + (x(2) - 6)^2;

% Khởi tạo điểm bắt đầu


x0 = [0, 0]; % Điểm bắt đầu tùy ý

% Định nghĩa ràng buộc bất bình thường (inequality constraints) g(x) <= 0
A = [];
b = [];

% Định nghĩa ràng buộc bình thường (equality constraints) h(x) = 0


Aeq = [];
beq = [];

% Định nghĩa giới hạn cho biến tối ưu hóa


lb = [-2, 0]; % Không giới hạn dưới cho x1 và x2
ub = [2, 4]; % Giới hạn trên cho x1 là vô hạn và x2 là 4

options = optimoptions('fmincon', 'Algorithm', 'interior-point', 'Display',


'iter');

% Sử dụng fmincon để tối ưu hóa


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

disp('Kết quả tối ưu:');


disp(x);

% Tạo một lưới điểm để vẽ đồ thị hàm mục tiêu và ràng buộc
x1 = linspace(-2, 2, 100);
x2 = linspace(0, 4, 100);
[X1, X2] = meshgrid(x1, x2);
Z = (X1 - 4).^2 + (X2 - 6).^2;

% Vẽ đồ thị hàm mục tiêu


figure;
contour(X1, X2, Z, 100);
hold on;

% Vẽ ràng buộc
x1_con = linspace(-2, 2, 100);
x2_con = x1_con.^2;
% Thay đổi dòng mã sau
x2_con(x1_con < 0) = NaN; % Đặt các giá trị không phù hợp thành NaN (không xác
định)

% Vẽ đồ thị ràng buộc


plot(x1_con, x2_con, 'r', 'LineWidth', 2);
% Đánh dấu điểm tối ưu
plot(x(1), x(2), 'ro', 'MarkerSize', 10);
xlabel('x1');
ylabel('x2');
title('Đồ thị hàm mục tiêu và ràng buộc');
legend('Hàm mục tiêu', 'Ràng buộc', 'Điểm tối ưu');
hold off;
% Tính giá trị của hàm mục tiêu tại điểm tối ưu
optimal_fval = fun(x);
% Hiển thị giá trị tối ưu của hàm mục tiêu
disp(['Giá trị tối ưu của hàm mục tiêu: ', num2str(optimal_fval)]);

function [c, ceq] = circlecon(x)


c = [];
ceq = [];
end

Baì 4
clc; clear all;
% Hàm mục tiêu
fun = @(x) (x(1) - 3)^2 + (x(2) - 2)^2;

% Ràng buộc
A = [];
b = [];
Aeq = [];
beq = [];
lb = [0; 0]; % x1 và x2 phải lớn hơn hoặc bằng 0
ub = []; % Không có ràng buộc trên giới hạn x1 và x2

% Ràng buộc phi tuyến tính


nonlcon = @(x) deal(x(1)^2 + x(2)^2 - 5, x(1) + x(2) - 3);

% Điểm khởi đầu


x0 = [1; 1];

% Gọi fmincon để tối ưu hóa


options = optimoptions('fmincon', 'Display', 'iter');
[x_min, f_min] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options);

% Hiển thị kết quả


disp('Kết quả tối ưu:');
disp(['x1 = ', num2str(x_min(1))]);
disp(['x2 = ', num2str(x_min(2))]);
disp(['f(x) = ', num2str(f_min)]);

bài 5
clc; clear all;

% Hàm mục tiêu


fun = @(x) x(1)^2 + x(2)^2;

% Ràng buộc
A = [-1, -1; -2, -1];
b = [-4; -5];
Aeq = [];
beq = [];
lb = [];
ub = [];

% Ràng buộc phi tuyến tính


nonlcon = [];
% Điểm khởi đầu
x0 = [0; 0];

% Gọi fmincon để tối ưu hóa


options = optimoptions('fmincon', 'Display', 'iter');
[x_min, f_min] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options);

% Hiển thị kết quả


disp('Kết quả tối ưu:');
disp(['x1 = ', num2str(x_min(1))]);
disp(['x2 = ', num2str(x_min(2))]);
disp(['f(x) = ', num2str(f_min)]);

bài 6
clc; clear all;

% Hàm mục tiêu


fun = @(x) x(1)^2 + x(2)^2;

% Ràng buộc
A = [];
b = [];
Aeq = [1, 2];
beq = 4;
lb = [0; 0];
ub = []; % Không có ràng buộc trên giới hạn x1 và x2

% Ràng buộc phi tuyến tính


nonlcon = @(x) deal(x(1)^2 + x(2)^2 - 5, []);

% Điểm khởi đầu


x0 = [0; 0];

% Gọi fmincon để tối ưu hóa


options = optimoptions('fmincon', 'Display', 'iter');
[x_min, f_min] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options);

% Hiển thị kết quả


disp('Kết quả tối ưu:');
disp(['x1 = ', num2str(x_min(1))]);
disp(['x2 = ', num2str(x_min(2))]);
disp(['f(x) = ', num2str(f_min)]);
Bài 8
clc; clear all;

% Hàm mục tiêu


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

% Ràng buộc
A = [2, 1; -1, 2];
b = [12; 4];
Aeq = [];
beq = [];
lb = [0; 0];
ub = [];

% Ràng buộc phi tuyến tính


nonlcon = [];

% Điểm khởi đầu


x0 = [1; 1];

% Gọi fmincon để tối ưu hóa


options = optimoptions('fmincon', 'Display', 'iter');
[x_min, f_min] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options);

% Hiển thị kết quả


disp('Kết quả tối ưu:');
disp(['x1 = ', num2str(x_min(1))]);
disp(['x2 = ', num2str(x_min(2))]);
disp(['f(x) = ', num2str(f_min)]);

bài 9
clc; clear all;

% Hàm mục tiêu


fun = @(x) x(1);

% Ràng buộc
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];

% Ràng buộc phi tuyến tính


nonlcon = @(x) deal((x(1) - 1)^2 + (x(2) - 1)^2 - 1, (x(1) - 1)^2 + (x(2) + 1)^2 -
1);

% Điểm khởi đầu


x0 = [0; 0];

% Gọi fmincon để tối ưu hóa


options = optimoptions('fmincon', 'Display', 'iter');
[x_min, f_min] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options);

% Hiển thị kết quả


disp('Kết quả tối ưu:');
disp(['x1 = ', num2str(x_min(1))]);
disp(['x2 = ', num2str(x_min(2))]);
disp(['f(x) = ', num2str(f_min)]);

You might also like