|
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 |
|
03-01-2008, 12:56 AM | #1 |
Đệ tử 1 túi
Tham gia ngày: Sep 2007
Bài gửi: 15
: |
lệnh fsolve trong Matlab
Có bác nào thạo "fsolve" ko giúp em voi!Em đang làm đồ án thì gặp thằng này đang mắc.
ví dụ:có hàm vd1 function F=vd1(q) 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=[ x+l2-l3*sin(q(1)+q(2)-q(3))-l0*cos(q(1)+q(2))+l1*cos(q(2))]; [ fx +l3*sin(q(1)+q(2)-q(3))+l0*sin(q(1)+q(2))-l1*sin(q(2))]; [ a-cos(q(1)+q(2)-q(3))]; Trong cửa sổ Matlab :q0=[0.94910999;4.804079037;0.52999628] options=optimset('Display','iter'); [q,fval] = fsolve(@vd1,q0,options) Vấn đề là nghiệm ko hội tụ,Bác nào có điều kiện giúp em với nhe!Thank! |
03-01-2008, 03:22 PM | #2 | |
Super Moderator
Tham gia ngày: Jun 2005
Bài gửi: 385
: |
Hình như cú pháp hàm F của bạn viết sai:
Trích:
Như vậy lệnh fsolve giải bài toán là một hệ chừng 100 phương trình, với chỉ có 3 ẩn số -> rất dễ rơi vào tình huống vô nghiệm. --- Tôi đoán bạn đang giải bài toán kiểu: F = [F1; F2; F3] trong đó F1, F2, F3 đều là số scalar. Nhưng vì trong function vd1, ngay từ đầu bạn quy định x=-10:0.1:10 nên nó đã là 1 vector, làm cho F1 biến thành vector. Giờ bạn cần tránh việc đặt x là 1 vector trong function vd1, hoặc làm sao đó để F1, F2, F3 không còn là vector (tùy vào yêu cầu bài toán của bạn).
__________________
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 |
|
09-01-2008, 09:31 PM | #3 | |
Đệ tử 1 túi
Tham gia ngày: Sep 2007
Bài gửi: 15
: |
Trích:
Nếu bác "picvendor" từng dùng fsolve rồi thì có thể nói rõ hơn về cách dùng nó cho em và anh em trong diễn đàn được ko? Em cảm ơn rất nhiều. |
|
10-01-2008, 12:01 AM | #4 | |
Super Moderator
Tham gia ngày: Jun 2005
Bài gửi: 385
: |
Cách dùng fsolve thì trong Matlab Help có mô tả kỹ rồi: http://www.math.colostate.edu/manual...im/fsolve.html
Viết Matlab theo một ví dụ hướng dẫn của họ thì mình thấy nó chạy thế nào: Trích:
function F = myfun(x) ... F = [ F1(x); F2(x); F3(x)] chẳng hạn là đầu ra F có 3 thành phần, thì tức là muốn giải hệ 3 phương trình: F1(x) = 0; F2(x) = 0; F3(x) = 0; mà ở đó biến x cũng có thể là nhiều chiều (ở bài toán của bạn thì ký hiệu là q, có 3 chiều). Phải nói rằng đây là công cụ rất mạnh của bộ Optimization toolbox, đứng trên cách nhìn tối ưu hóa để giải phương trình: thực hiện giải thuật lặp để tìm nghiệm x sao cho F(x) gần 0 nhất, tức là tối ưu hóa trị tuyệt đối của F(x). --- Trong bài toán của bạn, q là biến số, nhưng x là gì và tại sao x có thể thay đổi trong khoảng [-10; 10]? Nếu x cũng là biến số thì bạn ghép nó thành q4, nếu không thì bạn cần gán x là giá trị cụ thể trước khi chạy lệnh fsolve.
__________________
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 |
|
10-01-2008, 05:32 PM | #5 | |
Đệ tử 1 túi
Tham gia ngày: Sep 2007
Bài gửi: 15
: |
Trích:
Bác "picvendor" chắc đã từng làm việc với lệnh Fsolve vậy bác có thể cho em hỏi ý nghĩa của thông báo lỗi sau được ko? Error in ==> fsolve at 180 fuser = feval(funfcn{3},x,varargin{:}); Cảm ơn rất nhiều! Email của em:ld_canh7384@yahoo.com rất mong sự giúp đỡ của các cao thủ. |
|
10-01-2008, 11:08 PM | #6 | |
Super Moderator
Tham gia ngày: Jun 2005
Bài gửi: 385
: |
Bạn gửi file mô tả bài toán động học và cách bạn giải đi, tôi chưa giải bài toán này, nhưng nghe cũng thấy thú vị. Bạn hãy trình bày kỹ các phương trình và cách giải của bạn, tôi sẽ giúp bạn giải quyết bằng chương trình Matlab.
(bạn viết ra giấy rồi chụp hình gửi lên cũng được) Trích:
__________________
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 |
|
11-01-2008, 10:35 PM | #7 | |
Đệ tử 1 túi
Tham gia ngày: Sep 2007
Bài gửi: 15
: |
Chân thành cảm ơn sự giúp đỡ của bác "Picvendor"
Trích:
Thật tiếc file .avi của em bị mất rồi ko thì em gửi luôn cho Anh tham khảo |
|
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 |
26-01-2008, 09:17 AM | #9 |
Đệ tử 1 túi
Tham gia ngày: Sep 2007
Bài gửi: 15
: |
Vâng! Em làm thử được rồi chỉ mỗi tội là mỗi lần chạy để xem kết quả lâu quá(khi em muốn cho bước xấp xỉ lớn).Dù sao rất cảm ơn bác "picvendor" đã giúp em giải quyết vướng mắc,trong thời gian tới chắc còn phải hỏi bác nhiều vì em đang làm đồ án có liên quan đến nhiều Matlab-Simulink.Rất mong sự giúp đỡ của bác!
Chúc 1 ngày tốt lành! |
05-06-2014, 12:39 AM | #10 |
Nhập môn đệ tử
Tham gia ngày: Jun 2014
Bài gửi: 1
: |
Mình đang mầy mò phần giải hệ phương trình phi tuyến bằng matlab và đây là ví dụ mình lấy trên trang http://www.mathworks.com/help/optim/ug/fsolve.html
function F = myfun(x) F = [2*x(1) - x(2) - exp(-x(1)); -x(1) + 2*x(2) - exp(-x(2))]; x0 = [-5; -5]; % Make a starting guess at the solution options=optimset('Display','iter'); % Option to display output [x,fval] = fsolve(@myfun,x0,options) % Call optimizer Mình chạy thử thì nó báo lỗi thế này. Tất cả mình đều để ở file myfun.m ??? Input argument "x" is undefined. Error in ==> myfun at 2 F = [2*x(1) - x(2) - exp(-x(1)); Giờ lỗi này mình phải xử lý thế nào hả mọi người. |
|
|