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).