Cách giải phương trình bằng MATLAB

Theo bài giảng của Danilo Šćepanović - MIT Opencourseware
Nội dung

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


  • Đa thức bậc cao có thể dùng để xấp xỉ rất nhiều các hàm phi tuyến khác nhau
  • Matlab mô tả một đa thức bằng một vector chứa các hệ số. Mỗi vector P có thể dùng để mô tả một đa thức. Ví dụ: ax^3+bx^2+cx+d tương ứng với vector P=[a, b, c, d]
            P = [1 0 -2] mô tả đa thức x^2-2
            P = [2 0 0 0] mô tả đa thức 2x^3 
  • Tính toán với đa thức
    • Giả sử P là một vector có kích thước N+1 mô tả một đa thức bậc N. Để tìm nghiệm của đa thức sử dụng lệnh roots
                >> r = roots[P] % r là một vector có kích thước N
    • Ngược lại, nếu như biết các nghiệm của một đa thức, ta có thể tìm được đa thức đó với lệnh poly
                >> P = poly[r]  % r là vector chứa N nghiệm của P
    • Tính giá trị đa thức tại một điểm [lệnh polyval]
                >> y0 = polyval[P,x0]  % Tính y0 khi x = x0
    • Tính giá trị đa thức tại nhiều điểm
               >> y = polyval[P,x]        % x, y là 2 vector cùng kích thước 
  • Xấp xỉ đa thức
    • Matlab làm đơn giản việc tìm đa thức nội suy từ một bộ dữ liệu với lệnh polyfit.
                >> X=[-1 0 2]; Y=[0 -1 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 đỏ  

Hướng dẫn>> x=-4:0.1:4;
>> y=x.^2; 

>> y=y+randn[size[y]];>> plot[x,y,’.’];>> p=polyfit[x,y,2];

>> hold on; 

>> plot[x,polyval[p,x],’r’]

  • Giải phương trình phi tuyến
    • Nhiều bài toán thực tế buộc chúng ta phải giải phương trình f[x] = 0
    • Có thể dùng hàm fzeoro để giải nghiệm cho bất kỳ một hàm tùy ý. Tham số của hàm fzero là hàm số cần tìm nghiệm. Do đó trước khi dùng hàm fzero, ta cần tạo một mfile riêng chứa hàm muốn tìm nghiệm.
    • Ví dụ:

                    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
                    x=fzero[@myfun,1]

  • Tìm cực tiểu của hàm số
    • Lệnh fminbnd : tìm cực tiểu của một hàm trên một khoảng bị chặn.
    • Ví dụ ta đã có hàm myfun lưu trong 1 mfile nào đó. Muốn tìm giá trị nhỏ nhất của hàm này trên khoản [-1, 2] ta làm như sau:
                    >> x=fminbnd['myfun',-1,2];
                    % 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]
  • Lệnh fminsearch: tìm một cực tiểu của một hàm trên toàn bộ miền xác định
                    >> x=fminsearch['myfun',0.5]  % tìm một cực tiểu địa phương bắt đầu từ  x=0.5
  • Khi bạn muốn tìm cực trị hoặc tìm nghiệm một hàm mà không muốn tạo một mfile để chứa riêng hàm đó, có thể dùng cách sau:
          >> x=fzero[@myfun,1]
          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];
  • Opimization Toolbox
    • Nếu bạn thường xuyên làm việc với các bài toán tối ưu hóa, nên dành thời gian học cách sử dụng Optimization Toolbox. Đây là một Toolbox rất hữu ích khi làm việc với những bài toán tối ưu lớn và có cấu trúc.
    • Có thể kể ra một số câu lệnh trong Toolbox này như sau [vào help để có thêm thông tin]:
                >> linprog      % Giải bài toán quy hoạch tuyến tính sử dụng phương pháp nội suy
                >> 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]];

Video liên quan

Chủ Đề