Mercurial > forge
changeset 9784:5ff9b37ab1cb octave-forge
control-devel: calculate initial state vector
author | paramaniac |
---|---|
date | Mon, 19 Mar 2012 16:16:49 +0000 |
parents | 26f56e71407a |
children | f83050d0b00d |
files | extra/control-devel/devel/test_slident.m extra/control-devel/src/slident.cc |
diffstat | 2 files changed, 22 insertions(+), 57 deletions(-) [+] |
line wrap: on
line diff
--- a/extra/control-devel/devel/test_slident.m Mon Mar 19 15:35:53 2012 +0000 +++ b/extra/control-devel/devel/test_slident.m Mon Mar 19 16:16:49 2012 +0000 @@ -2031,7 +2031,7 @@ rcond = 0.0; tol = -1.0; -[a, b, c, d, q, ry, s, k] = slident (Y, U, nobr, meth, alg, jobd, batch, conct, ctrl, rcond, tol) +[a, b, c, d, q, ry, s, k, x0] = slident (Y, U, nobr, meth, alg, jobd, batch, conct, ctrl, rcond, tol) ae = [ 0.8924 0.3887 0.1285 0.1716 @@ -2077,22 +2077,26 @@ -figure (1) -plot (Y) +% figure (1) +% plot (Y) P = ss (a, b, c, d, 1); -figure (2) -lsim (P, U) -%lsim (P, U, [], x0) % initial values dependent on realization, IB01BD != IB01CD +% figure (2) +% lsim (P, U) +% lsim (P, U, [], x0) % initial values dependent on realization, IB01BD != IB01CD -[y, t] = lsim (P, U); +% [y, t] = lsim (P, U); +[y, t] = lsim (P, U, [], x0); + figure (3) plot (t, Y, 'b', t, y, 'r') legend ('y measured', 'y simulated', 'location', 'southeast') -axis tight +%axis tight + +% print -depsc2 ident.eps %n %sv
--- a/extra/control-devel/src/slident.cc Mon Mar 19 15:35:53 2012 +0000 +++ b/extra/control-devel/src/slident.cc Mon Mar 19 16:16:49 2012 +0000 @@ -561,7 +561,6 @@ // ldwork = max (ldwork_a, ldwork_b, ldwork_c) -/* // arguments in char jobx0 = 'X'; char comuse = 'U'; @@ -571,56 +570,18 @@ int ldv = max (1, n); ColumnVector x0 (n); - Matrix (ldv, n); + Matrix v (ldv, n); // workspace int liwork_c = n; // if JOBX0 = 'X' and COMUSE <> 'C' int ldwork_c; - - ldwork_c = ldw1 + n*( n + m + l ) + max (5*n, ldw1, min (ldw2, ldw3)) - - - // I can't find a definition for parameter 't' - -C The length of the array DWORK. -C LDWORK >= 2, if JOBX0 = 'N' and COMUSE <> 'C', or -C if max( N, M ) = 0. -C Otherwise, -C LDWORK >= LDW1 + N*( N + M + L ) + -C max( 5*N, LDW1, min( LDW2, LDW3 ) ), -C where, if COMUSE = 'C', then -C LDW1 = 2, if M = 0 or JOB = 'B', -C LDW1 = 3, if M > 0 and JOB = 'D', -C LDWa = t*L*(r + 1) + max( N + max( d, f ), 6*r ), -C LDW2 = LDWa, if M = 0 or JOB = 'B', -C LDW2 = max( LDWa, t*L*(r + 1) + 2*M*M + 6*M ), -C if M > 0 and JOB = 'D', -C LDWb = (b + r)*(r + 1) + -C max( q*(r + 1) + N*N*M + c + max( d, f ), 6*r ), -C LDW3 = LDWb, if M = 0 or JOB = 'B', -C LDW3 = max( LDWb, (b + r)*(r + 1) + 2*M*M + 6*M ), -C if M > 0 and JOB = 'D', -C r = N*M + a, -C a = 0, if JOBX0 = 'N', -C a = N, if JOBX0 = 'X'; -C b = 0, if JOB = 'B', -C b = L*M, if JOB = 'D'; -C c = 0, if JOBX0 = 'N', -C c = L*N, if JOBX0 = 'X'; -C d = 0, if JOBX0 = 'N', -C d = 2*N*N + N, if JOBX0 = 'X'; -C f = 2*r, if JOB = 'B' or M = 0, -C f = M + max( 2*r, M ), if JOB = 'D' and M > 0; -C q = b + r*L; -C and, if JOBX0 = 'X' and COMUSE <> 'C', then -C LDW1 = 2, -C LDW2 = t*L*(N + 1) + 2*N + max( 2*N*N, 4*N ), -C LDW3 = N*(N + 1) + 2*N + max( q*(N + 1) + 2*N*N + L*N, -C 4*N ), -C q = N*L. -C For good performance, LDWORK should be larger. + int t = nsmp; + + int ldw1_c = 2; + int ldw2_c = t*l*(n + 1) + 2*n + max (2*n*n, 4*n); + int ldw3_c = n*(n + 1) + 2*n + max (n*l*(n + 1) + 2*n*n + l*n, 4*n); - + ldwork_c = ldw1_c + n*( n + m + l ) + max (5*n, ldw1_c, min (ldw2_c, ldw3_c)); OCTAVE_LOCAL_BUFFER (int, iwork_c, liwork_c); OCTAVE_LOCAL_BUFFER (double, dwork_c, ldwork_c); @@ -632,7 +593,7 @@ // SLICOT routine IB01CD F77_XFCN (ib01cd, IB01CD, - (jobx0, comuse, job***, + (jobx0, comuse, jobbd, n, m, l, nsmp, a.fortran_vec (), lda, @@ -676,7 +637,7 @@ error_msg ("ident", info_c, 2, err_msg_c); warning_msg ("ident", iwarn_c, 6, warn_msg_c); -*/ + // return values retval(0) = a; @@ -689,7 +650,7 @@ retval(6) = s; retval(7) = k; - //retval(8) = x0; + retval(8) = x0; //retval(0) = octave_value (n); //retval(1) = r; //retval(2) = sv;