diff options
Diffstat (limited to 'modules/graphics/macros/paramfplot2d.sci')
-rwxr-xr-x | modules/graphics/macros/paramfplot2d.sci | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/modules/graphics/macros/paramfplot2d.sci b/modules/graphics/macros/paramfplot2d.sci new file mode 100755 index 000000000..38dac6712 --- /dev/null +++ b/modules/graphics/macros/paramfplot2d.sci @@ -0,0 +1,78 @@ +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// Copyright (C) INRIA +// This file must be used under the terms of the CeCILL. +// This source file is licensed as described in the file COPYING, which +// you should have received as part of this distribution. The terms +// are also available at +// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt + +function paramfplot2d(f,x,theta,flag,rect) + //animated plot of x-->f(x,t) for t=theta(1),theta(2),etc + //x=N-vector of x-values + //f(x,t)=N-vector of y-values. + //f: mapping x,t -> f(x,t) = R^N valued function for x= vector of R^N and t=real number. + //f can be a either Scilab function or a dynamically linked routine since + // y=f(x,t) is evaluated as y=feval(x(:),t,f). See feval. + // Here y should be a column vector. + // vector of parameters theta=[theta(1), theta(2),... theta(M)] + // Optional parameters + //flag = 'yes' (screen is cleared between two consecutive plots). + //flag = 'no' (screen is not cleared between two consecutive plots). + // + //rect = "rectangle" [xmin, xmax, ymin, ymax] (1 x 4 real vector), + // containing a-priori lower and upper bounds for x and f(t,x). + //function y=f(x,t),y=abs(cos(1.5*x+4*t)).*sin(x+10*t),endfunction + //x=linspace(0,20*%pi,500);theta=0:0.05:5; + [lhs,rhs]=argn(0) + + if ~rhs then + deff("y=f(x,t)","y=t*sin(x)") + x=linspace(0,2*%pi,50);theta=0:0.05:1; + clf; + paramfplot2d(f,x,theta); + return; + end + + if rhs<3 then + error(msprintf(gettext("%s: Wrong number of input argument(s): At least %d expected.\n"), "paramfplot2d", 3)); + end + + x=x(:); + theta=theta(:).'; // it should be a row-vector + if rhs<5 then //compute the data bounds + xmin=min(x);xmax=max(x); + ymin=%inf;ymax=-%inf; + for t=theta + y=f(x,t); ymin=min(ymin,min(y)); ymax=max(ymax,max(y)); + end + rect=[xmin,xmax,ymin,ymax]; + end + if rhs<4 then flag="no";end + realtimeinit(0.1); + + clf(); + fig=gcf(); + a=gca(); + a.data_bounds=matrix(rect,2,2); + a.axes_visible="on"; + y=feval(x,theta(1),f); + xpoly(x,y(:));p=gce(); //the polyline handle + realtime(0); + if flag=="no" then + drawlater(); + for k=1:size(theta,"*") + realtime(k); + y=feval(x,theta(k),f); + p.data(:,2)=y(:); + drawnow(); + end + else + drawlater(); + for k=1:size(theta,"*") + realtime(k); + plot2d(x,feval(x,theta(k),f)) + drawnow(); + end + end + +endfunction |