|
Tài trợ cho PIC Vietnam |
Matlab-Simulink & Labview & 20-Sim Các công cụ mô phỏng đa ngành... |
|
Ðiều Chỉnh | Xếp Bài |
12-01-2008, 05:43 AM | #8 |
Super Moderator
Tham gia ngày: Jun 2005
Bài gửi: 385
: |
Tôi tách thành 3 file:
%%%---vd1_init.m---%%% % initialize function f(x) and calculate df/dx x=-10:0.1:10; a0=1; b0=-2; c0=3; fx=a0*x.^2+ b0*x + c0; df=[diff(fx) 0]; %so that df has the same length with f a=df./sqrt(df.^2+1); %%%---%%% %%%---vd1.m---%%% function F=vd1(q,t,fxt,at) % bring the commented part out of this function % x=-10:0.1:10; % a0=1; b0=-2; c0=3; % % fx=a0*x.^2+ b0*x + c0; % df=diff(fx); % a=df/sqrt(df.^2+1); l0=490; l1=250; l2=150; l3=200; F=[t+l2-l3*sin(q(1)+q(2)-q(3))-l0*cos(q(1)+q(2))+l1*cos(q(2));... fxt+l3*sin(q(1)+q(2)-q(3))+l0*sin(q(1)+q(2))-l1*sin(q(2));... at-cos(q(1)+q(2)-q(3))]; %%%---%%% %%% ---vd1_run.m--- %%% % q0 should vary with x, anyway using the same initial guess is ok vd1_init; q0=[0.94910999;4.804079037;0.52999628] q_matrix=[]; options=optimset('Display','iter'); for i=1:length(x) t = x(i); fxt = fx(i); at = a(i); [qt,fval] = fsolve(@vd1,q0,options,t,fxt,at); %t,fxt,at come after "options", meaning they are parameter, fsolve doesn't optimize those parameters q_matrix = [q_matrix qt]; %solution for each x is a column of q_matrix end %at x=x(i), solution is: q=q_matrix(:,i) % Read help of fsolve: (online help contains one more syntax than Matlab help) % http://nf.apac.edu.au/facilities/sof...im/fsolve.html % x = fsolve(fun,x0,options,P1,P2,...) passes the problem-dependent % parameters P1, P2, etc., directly to the function fun. % Good study! % conso0 & picvendor, www.picvietnam.com, 20080111. %%%---%%% --- Cách giải bài này là: - Xấp xỉ hàm liên tục f(x) bằng một chuỗi, đây là bước rời rạc hóa, bạn đã làm được. Lưu ý chọn bước để xấp xỉ càng nhỏ càng tốt. (phụ thuộc vào độ phân giải bộ điều khiển của dao) - Tính đạo hàm df/dx, do đạo hàm chỉ phụ thuộc vào hình dạng của f(x) mà không phụ thuộc vào các góc quay q_i, nên ta mang ra ngoài, tính đạo hàm một lần thôi. - Giải hệ phương trình [F1(q); F2(q); F3(q)] = [0;0;0] bằng lện fsolve, đối với mỗi giá trị x. (mỗi giá trị x thì có giá trị fx và ax tương ứng). --- Mã lệnh bạn gửi lúc đầu có một số lỗi về cú pháp: + Tính giá trị a, nếu bạn ghi a=df/sqrt(df.^2+1) thì cái dấu / có ý nghĩa là phép chia (giả) giữa 2 ma trận. Cần sửa là a=df./sqrt(df.^2+1) - từng phần tử chia cho nhau. + F = [...];[...];[...]; không tạo được vector 3 thành phần. + fx +l3*sin(q(1)+q(2)-q(3))+l0*sin(q(1)+q(2))-l1*sin(q(2)) - để ý khoảng trống ngay sau biến fx, nó tách câu lệnh này thành vector có 2 cột, đó là lý do bạn thấy lỗi ở feval (lúc mới sửa tôi cũng gặp lỗi đó, nó báo lỗi "vercat" và cho biết 3 dòng của F không có cùng số cột).
__________________
Cách tìm link DOI để yêu cầu bài báo ở Sciencedirect: http://www.picvietnam.com/forum/show...&postcount=682 Cách tìm link DOI để yêu cầu bài báo ở IEEE: http://www.picvietnam.com/forum/show...&postcount=760 Cuộc thi thiết kế PIC (tạm ngưng): http://www.picvietnam.com/contest |
|
|