初学者示例
我们下面给出一些简单的命令。所有的命令输入完都要回车,因为最后一个提示符被解释。
-->a=1;
-->A=2;
-->a+A
ans =
3.
-->//两条命令写在同一行
-->c=[1 2];b=1.5
b =
1.5
-->//一条命令分几行
-->u=1000000.000000*(a*sin(A))^2+...
--> 2000000.000000*a*b*sin(A)*cos(A)+...
--> 1000000.000000*(b*cos(A))^2
u =
81268.994
先将值1和2赋给变量a和A。一条命令结束如用了分号,表示不显示结果。注意,Scilab中区分大小写。接着处理两条命令,并将第二条命令的结果显示出来,因为其后没跟分号。最后一条命令示意如何用"…"把一条命令写成几行。这一标记只有在线键入时才需要,是为了闭开回车键的影响。//后面的字符串不被解释(它不是命令行)。
-->a=1;b=1.5;
-->2*a+b^2
ans =
4.25
-->//至此我们已经定义了一些变量,通过键入下面命令来列出这些变量:
-->who
your variables are...
ans b a bugmes MSDOS home PWD
TMPDIR percentlib fraclablib soundlib xdesslib
utillib tdcslib siglib s2flib roblib optlib metalib
elemlib commlib polylib autolib armalib alglib mtlblib
SCI %F %T %z %s %nan %inf
old newstacksize $ %t %f %eps
%io %i %e %pi
using 3975 elements out of 1000000.
and 43 variables out of 1023
我们得到已定义变量列表,包括变量a,b,c,A和由不同的库组成的初始环境变量以及一些特定的"永久"变量。
下面是表达式的例子,式中包含了常量和已定义的变量。结果被保存到标准的缺省变量ans中。
-->I=1:3
I =
! 1. 2. 3. !
-->W=rand(2,4);
-->W(1,I)
ans =
! 0.2113249 0.0002211 0.6653811 !
-->W(:,I)
ans =
! 0.2113249 0.0002211 0.6653811 !
! 0.7560439 0.3303271 0.6283918 !
-->W($,$-1)
ans =
0.6283918
定义向量下标I,W是随机产生的一个2x4矩阵,从W中抽取子矩阵。符号$表示矩阵或向量的最后一行或最后一列的下标。冒号代表"所有的行"或"所有的列"。
-->sqrt([4 -4])
ans =
! 2. 2.i !
用向量作为参数来调用一个函数(或基元),结果是一个复杂的向量。
-->p=poly([1 2 3],'z','coeff')
p =
2
1 + 2z + 3z
-->//p是z的多项式,系数分别为1, 2, 3
-->//p也可以定义为:
-->s=poly(0,'s');p=1+2*s+s^2
p =
2
1 + 2s + s
下面是生成一个多项式更复杂的命令。
-->M=[p, p-1; p+1 ,2]
M =
! 2 2 !
! 1 + 2s + s 2s + s !
! !
! 2 !
! 2 + 2s + s 2 !
-->det(M)
ans =
2 3 4
2 - 4s - 4s - s
定义一个多项式矩阵。多项式矩阵的语法规范与定义常数矩阵的相同。用函数det来计算多项式矩阵的行列式值。
-->F=[1/s ,(s+1)/(1-s)
--> s/p , s^2 ]
F =
! 1 1 + s !
! - ----- !
! s 1 - s !
! !
! 2 !
! s s !
! --------- - !
! 2 !
! 1 + 2s + s 1 !
-->F('num')
ans =
! 1 1 + s !
! !
! 2 !
! s s !
-->F('den')
ans =
! s 1 - s !
! !
! 2 !
! 1 + 2s + s 1 !
-->F('num')(1,2)
ans =
1 + s
定义一个关系多项式矩阵。(F的内部表达式是表格tlist的分类列表('the type',num,den) ,这里num和den是两个多项式矩阵)。通过对分类列表的抽取操作可以获得矩阵F的分子矩阵和分母矩阵。最后一条命令是直接抽取分子矩阵F('num')的第(1,2)项。
-->pause
-1->pt=return(s*p)
-->pt
pt =
2 3
s + 2s + s
我们用pause命令进入新的工作环境,出现提示符-1->,表示新环境的级别(级别1)。前一环境中已有的所有变量在新环境中仍有效。新环境产生的变量也可以通过return命令返回给以前的工作环境。用不带参数的return命令,是在返回旧环境前清除所有在新环境中产生的变量。pause功能对于调试非常有用。
-->F21=F(2,1);v=0:0.01:%pi;frequencies=exp(%i*v);
-->response=freq(F21('num'),F21('den'),frequencies);
-->plot2d(v',abs(response)',[-1],'011',' ',[0,0,3.5,0.7],[5,4,5,7]);
-->xtitle(' ','radians','magnitude');
从前面定义的矩阵F中抽取一项,来定义一个关系多项式,后跟关系多项式的赋值,为复杂的频率值由frequencies定义的向量。关系多项式的赋值由freq来完成。F12('num')和F12('den')分别是关系多项式的分母多项式和分子多项式。注意,多项式F12('num')也可以用F('num')(1,2)来抽取矩阵F的方式获得。用基本绘图命令plot2d可对赋值结果进行可视化(见图 1.1)。
-->w=(1-s)/(1+s);f=1/p
f =
1
---------
2
1 + 2s + s
-->horner(f,w)
ans =
2
1 + 2s + s
----------
4
函数horner是对多项式进行(可能是符号的)变量变换(如这里是进行双线性变换f(w(s))).
-->A=[-1,0;1,2];B=[1,2;2,3];C=[1,0];
-->Sl=syslin('c',A,B,C);
-->ss2tf(Sl)
ans =
! 1 2 !
! ----- ----- !
! 1 + s 1 + s !
在状态空间体系定义一个线性系统。这里通过状态空间矩阵(A,B,C)函数syslin定义了连续('c')系统Sl。函数ss2tf将Sl转换到传递函数矩阵体系。
-->s=poly(0,'s');
-->R=[1/s,s/(1+s),s^2]
R =
! 2 !
! 1 s s !
! - ----- - !
! s 1 + s 1 !
-->Sl=syslin('c',R);
-->tf2ss(Sl)
ans =
ans(1) (state-space system:)
!lss A B C D X0 dt !
ans(2) = A matrix =
! - 0.5 - 0.5 !
! - 0.5 - 0.5 !
ans(3) = B matrix =
! - 1. 1. 0. !
! 1. 1. 0. !
ans(4) = C matrix =
! - 1. 0. !
ans(5) = D matrix =
! 2 !
! 0 1 s !
ans(6) = X0 (initial state) =
! 0. !
! 0. !
ans(7) = Time domain =
c
定义关系矩阵R,Sl是具有(不合适的)传递函数矩阵R的连续线性系统。tf2ss将Sl转换到状态空间体系中。注意,线性系统用分类列表(共7项)来表示。
-->sl1=[Sl;2*Sl+eye()]
sl1 =
! 2 !
! 1 s s !
! - ----- - !
! s 1 + s 1 !
! !
! 2 !
! 2 + s 2s 2s !
! ----- ---- --- !
! s 1 + s 1 !
-->size(sl1)
ans =
! 2. 3. !
-->size(tf2ss(sl1))
ans =
! 2. 3. !
在传递函数矩阵体系中sl1是一个由Sl和(2*Sl+eye())并联(parallel inter-connection)而构成的线性系统,在状态空间体系中S1具有同样的语法描述。
-->deff('[Cl]=compen(Sl,Kr,Ko)',[ '[A,B,C,D]=abcd(Sl);';
--> 'A1=[A-B*Kr ,B*Kr; 0*A ,A-Ko*C]; Id=eye(A);';
--> 'B1=[B; 0*B];';
--> 'C1=[C ,0*C];Cl=syslin(''c'',A1,B1,C1)' ])
在线定义一个名为compen的函数,该函数用于计算线性系统(S1)的状态空间表达式(C1)。S1包括一个增益为Ko的观测器和一个增益为Kr的控制器。注意,这里的矩阵是由其它矩阵构造而成的分块矩阵。
-->A=[1,1 ;0,1];B=[0;1];C=[1,0];Sl=syslin('c',A,B,C);
-->Cl=compen(Sl,ppol(A,B,[-1,-1]),...
--> ppol(A',C',[-1+%i,-1-%i])');
-->Aclosed=Cl('A'),spec(Aclosed)
Aclosed =
! 1. 1. 0. 0. !
! - 4. - 3. 4. 4. !
! 0. 0. - 3. 1. !
! 0. 0. - 5. 1. !
ans =
! - 1. !
! - 1. !
! - 1. + i !
! - 1. - i !
调用前面定义的函数compen,其中增益计算调用了基元ppol,基元ppol用于极点配置。显示结果矩阵Aclosed,并调用基元spec来检查其极点的配置情况。Spec用于计算矩阵的特征值。(这里由deff在线定义的函数compen,也是函数接收线性系统(Sl)作为输入、返回线性系统(Cl)作为输出的一个例子。一般情况Scilab函数在文件中定义并用getf装载入Scilab)。
-->//将主机环境保存到myfile文件中
-->save('myfile')
-->//请求主机系统执行一条系统命令
-->unix_s('rm myfile')
-->//请求主机系统输出信息到该Scilab窗口
-->unix_w('date')
Thu Nov 12 15:54:58 MET 1998
与Unix环境的关系。
-->foo=['void foo(a,b,c)';
--> 'double *a,*b,*c;'
--> '{ *c = *a + *b;}']
foo =
!void foo(a,b,c) !
! !
!double *a,*b,*c; !
! !
!{ *c = *a + *b;} !
-->write('foo.c',foo);
-->unix_s('make foo.o')
-->link('foo.o','foo','C');
-->deff('[c]=myplus(a,b)',...
--> 'c=fort(''foo'',a,1,''d'',b,2,''d'',''out'',[1,1],3,''d'')')
-->myplus(5,7)
ans =
12.
定义一个字符串类型的列向量,所含字符串用于定义一个C函数文件。程序经编译 (需要编译器)后通过link命令动态地链接到Scilab,再被函数myplus交互地调用。
-->deff('[ydot]=f(t,y)','ydot=[a-y(2)*y(2) -1;1 0]*y')
-->a=1;y0=[1;0];t0=0;instants=0:0.02:20;
-->y=ode(y0,t0,instants,f);
-->plot2d(y(1,:)',y(2,:)',[-1],'011',' ',[-3,-3,3,3],[10,2,10,2])
-->xtitle('Van der Pol')
定义一个函数用来计算一阶向量的微分f(t,y),接着定义函数中使用的常量,再由基元ode集成由Scilab的函数f(t,y)定义的微分方程。y0=[1;0],当t=0,且方程的解以时间值序列 给出。(函数f可以定义成C/Fortran程序。)结果绘制在图1.2中,反映了集成向量的第一个元素与向量的第二个元素之间的关系。
|