comparison scripts/control/sysdup.m @ 3228:dbcc24961c44

[project @ 1998-12-09 18:42:12 by jwe]
author jwe
date Wed, 09 Dec 1998 18:42:13 +0000
parents ba1c7cdc6090
children 28aba52a2368
comparison
equal deleted inserted replaced
3227:e090571062ee 3228:dbcc24961c44
1 # Copyright (C) 1996 A. Scottedward Hodel 1 # Copyright (C) 1996,1998 A. Scottedward Hodel
2 # 2 #
3 # This file is part of Octave. 3 # This file is part of Octave.
4 # 4 #
5 # Octave is free software; you can redistribute it and/or modify it 5 # Octave is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by the 6 # under the terms of the GNU General Public License as published by the
41 # (input_list) | | (output_list) 41 # (input_list) | | (output_list)
42 # -------------------- 42 # --------------------
43 43
44 # A. S. Hodel August 1995 44 # A. S. Hodel August 1995
45 # modified by John Ingram July 1996 45 # modified by John Ingram July 1996
46 # $Revision: 1.2 $ 46 # $Revision: 2.0.0.0 $
47 47
48 save_val = implicit_str_to_num_ok; # save for later 48 save_val = implicit_str_to_num_ok; # save for later
49 implicit_str_to_num_ok = 1; 49 implicit_str_to_num_ok = 1;
50 50
51 if( nargin != 3) 51 if( nargin != 3)
54 54
55 if( !is_struct(Asys)) 55 if( !is_struct(Asys))
56 error("Asys must be a system data structure (see ss2sys, tf2sys, or zp2sys)") 56 error("Asys must be a system data structure (see ss2sys, tf2sys, or zp2sys)")
57 endif 57 endif
58 58
59 if (Asys.sys(4) != 1) 59 Asys = sysupdate(Asys,"ss");
60 Asys = sysupdate(Asys,'ss'); 60 [nn,nz,mm,pp] = sysdimensions(Asys);
61 endif 61 [aa,bb,cc,dd] = sys2ss(Asys);
62
63 mm = rows(Asys.inname);
64 pp = rows(Asys.outname);
65 62
66 # first duplicate inputs 63 # first duplicate inputs
67 if(is_vector(input_list)) 64 if(is_vector(input_list))
68 for ii=1:length(input_list); 65 for ii=1:length(input_list);
69 Asys.b(:,mm+ii) = Asys.b(:,input_list(ii)); 66 bb(:,mm+ii) = bb(:,input_list(ii));
70 Asys.d(:,mm+ii) = Asys.d(:,input_list(ii)); 67 dd(:,mm+ii) = dd(:,input_list(ii));
71 end 68 end
72 elseif(!isempty(input_list)) 69 elseif(!isempty(input_list))
73 error("input_list must be a vector or empty"); 70 error("input_list must be a vector or empty");
74 endif 71 endif
75 72
76 73
77 # now duplicate outputs 74 # now duplicate outputs
78 osize = min(size(output_list)); 75 osize = min(size(output_list));
79 if(osize == 1) 76 if(osize == 1)
80 for ii=1:length(output_list); 77 for ii=1:length(output_list);
81 Asys.c(pp+ii,:) = Asys.c(output_list(ii),:); 78 cc(pp+ii,:) = cc(output_list(ii),:);
82 Asys.d(pp+ii,:) = Asys.d(output_list(ii),:); 79 dd(pp+ii,:) = dd(output_list(ii),:);
83 end 80 end
84 elseif(osize != 0) 81 elseif(osize != 0)
85 error("output_list must be a vector or empty"); 82 error("output_list must be a vector or empty");
86 endif 83 endif
87 84
88 yd = Asys.yd(output_list); 85 [stnam,innam,outnam,yd] = sysgetsignals(Asys);
89 Asys.yd = [Asys.yd yd]; 86 tsam = sysgettsam(Asys);
90 87
91 # give default names to the added inputs 88 # pack system and then rename signals
89 retsys = ss2sys(aa,bb,cc,dd,tsam,nn,nz);
90 retsys = syssetsignals(retsys,"in",innam,1:mm);
91 retsys = syssetsignals(retsys,"out",outnam,1:pp);
92 retsys = syssetsignals(retsys,"yd",yd,1:pp);
93
94 # update added input names
92 for ii=(mm+1):(mm+length(input_list)) 95 for ii=(mm+1):(mm+length(input_list))
93 orig_name = Asys.inname(input_list(ii-mm),:); 96 onum = input_list(ii-mm);
94 97 strval = sprintf("%s(dup)",sysgetsignals(retsys,"in",onum,1) );
95 #disp("sysdup: orig_name=") 98 retsys = syssetsignals(retsys,"in",strval,ii);
96 #orig_name
97 #disp("/sysdup")
98
99 strval = [dezero(orig_name),"(dup)"];
100
101 #disp("sysdup: strval=")
102 #strval
103 #disp("/sysdup")
104
105 Asys.inname(ii,1:length(strval)) = [strval];
106
107 #disp("sysdup: resulting Asys.inname:")
108 #Asys.inname
109 #disp("/sysdup");
110
111 endfor 99 endfor
112 100
101 # update added output names/discrete flags
113 # give default names to the added outputs 102 # give default names to the added outputs
114 for jj=(pp+1):(pp+length(output_list)) 103 for jj=(pp+1):(pp+length(output_list))
115 if(isstr(Asys.outname)) 104 onum = output_list(jj-pp);
116 orig_name =Asys.outname; 105 strval = sprintf("%s(dup)",sysgetsignals(retsys,"out",onum,1) );
117 else 106 retsys = syssetsignals(retsys,"out",strval,jj);
118 orig_name = Asys.outname(output_list(jj-pp),:); 107 dflg = sysgetsignals(retsys,"yd",onum);
119 endif 108 retsys = syssetsignals(retsys,"yd",dflg,jj);
120 strval = [dezero(orig_name),"(dup)"];
121 Asys.outname(jj,1:length(strval)) = [strval];
122
123 endfor 109 endfor
124
125
126
127 if(max(size(Asys.d)) > 1 )
128 Asys.sys = [2 0 0 1]; # change default form to state space
129 # tf and zp are no longer relevant
130 endif
131
132 retsys = Asys;
133 110
134 implicit_str_to_num_ok = save_val; # restore value 111 implicit_str_to_num_ok = save_val; # restore value
135 112
136 endfunction 113 endfunction