Cách giải phương trình bằng MATLAB
Theo bài giảng của Danilo Šćepanović - MIT Opencourseware 1. Đại số tuyến tính2. Đa thức3. Bài toán tối ưu4. Tính đạo hàm và tích phân số 5. Giải phương trình vi phân 1. Đại số tuyến tính a/ Hệ phương trình tuyến tính Với một hệ phương trình tuyến tính x+2y - 3z = 5 -3x - y + z = -8 x - y + z = 0 Hệ này được biểu diễn dưới dạng ma trân : Ax=b. Trong MATLAB, thực hiện giải hệ này như sau: >> A=[1 2 -3;-3 -1 1;1 -1 1]; >> b=[5;-8;0]; >> X=A\b; % X là một vector 3x1 chứa giá trị của x,y và z thỏa mãn phương trình. % Phép \ sẽ làm việc với hệ phương trình có A là ma trận vuông hoặc ma trận chữ nhật % Phép \ đưa ra một nghiệm khi hệ có vô số nghiệm. % Nếu hệ vô nghiệm, khi thực hiện MATLAB sẽ đưa ra một cảnh báo và vẫn trả về một vector 3x1. b/ Các phép toán khác với ma trận >> mat=[1 2 -3;-3 -1 1;1 -1 1]; >> r=rank(mat); % Tính hạng của ma trận >> d=det(mat); % Tính định thức, mat phải là ma trận vuông % Nếu định thức khác không thì ma trận là khả đảo. >> E=inv(mat); % Tính ma trận nghịch đảo >> eig(mat) % Tính các trị riêng của ma trận >> rank(mat) % Tìm hạng của ma trận >> rref(mat) % Đưa một hệ tuyến tính về dạng bậc thang => Có rất rất nhiều câu lệnh thực hiện với ma trận, để xem tất cả bạn hãy vào help. Bài Tập Giải hệ phương trình sau Hệ 1 x+4y =34 -3x+y=2 Hệ 2 2x-2y=4 -x+ y =3 3x+4y=2 Tính rank của ma trận của hệ 2. 2. Đa thức
P = [2 0 0 0] mô tả đa thức 2x^3
>> p2 = polyfit(X,Y,2); % tìm đa thức bậc 2 phù hợp nhất đi qua các điểm (-1,0), (0 -1) và (2,3) % gõ help polyfit để biết thêm về cách dùng >> plot(X,Y,’o’, ‘MarkerSize’, 10); >> hold on; >> x = -3:.01:3; >> plot(x,polyval(p2,x), ‘r--’); Bài tập Tính y= x^2 với x= -4:0.1:4 Cộng thêm nhiễu ngẫu nhiên vào các giá trị tính được đó. Trong bài tập này, hãy dùng hàm randn. Vẽ tín hiệu có nhiễu thu được.
Tìm đa thức bậc 2 xấp xỉ bộ dữ liệu có nhiễu đó. Vẽ đa thức đó trên cùng một đồ thị. Dùng cùng giá trị x và đường màu đỏ
>> y=y+randn(size(y));>> plot(x,y,’.’);>> p=polyfit(x,y,2); >> hold on; >> plot(x,polyval(p,x),’r’)
Tạo ra một file riêng chứa hàm. Lưu mfile này dưới tên 'myfun' sau đó gõ lệnh trên Work Space như sau:
x=fzero('myfun',1) % 1 là giá trị ước đoán mà ta nghĩ nằm gần nghiệm
% Chú ý: hàm myfun là một hàm một biến % fminbnd sẽ trả về một điểm cực tiểu của hàm myfun trong đoạn [-1 , 2]
Cách làm này thường được dùng hàm có dạng đơn giản >> x=fzero(@(x)(cos(exp(x))+x^2-1), 1 ); % ở đây f(x)= cos(exp(x))+x^2-1 >> x=fminbnd(@(x)(cos(exp(x))+x^2-1),-1,2);
>> quadprog % Giải bài toán quy hoạch bậc 2 >> fmincon % Giải bài toán tối ưu phi tuyến có điều kiện ràng buộc Bài tập Tìm giá trị nhỏ nhất của hàm f(x)= cos(4x)sin(10x)exp(-|x|) trong dải [-π,π] dùng hàm fminbnd Hướng dẫn: Lập mfile với tên myFun.m với nội dung như sau: function y=myFun(x) y=cos(4*x).*sin(10*x).*exp(-abs(x)); Trên Work Space, tìm cực tiểu như sau: >> x0=fminbnd('myFun',-pi,pi); % Vẽ đồ thị hàm số trong khoảng đó để kiểm tra >> figure; >> x=-pi:.01:pi; >> plot(x,myFun(x)); |