View Single Post
Old 12-01-2008, 05:43 AM   #8
picvendor
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
picvendor vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn