% Let us introduce you into the programming language of
% EULER.
% 
% The programming style is rather straightforward and classical.
% We first make a simple example.
>function f(x)
$return x^3+x^2-x
$endfunction
% The function may be used in any expression, just like
% the built-in functions.
>f(5)+f(f(3))
% This function will work for vectors x.
>f(1:10)
% A function can call itself.
>function fakult (n)
$if n<=0; return 1; endif;
$return n*fakult(n-1)
$endfunction
% This defines the faculty function.
>fakult(5)
% We can achieve the same result with a loop.
>function fakult1 (n)
$x=1; loop 2 to n; x=x*#; end;
$return x;
$endfunction
% This should be a bit faster.
>fakult1(5)
% To get the result for a vector input, you must use the map function.
>map("fakult1",5:10)
% You may provide default values for parameters.
>function pnorm (v,p=0)
$if p>=1; return sum(abs(v)^p)^(1/p);
$else return max(abs(v))
$endif;
$endfunction
% If p=0 (the default), norm computes the maximum norm.
>v=[2,3,-2]; pnorm(v)
% Or the L_2 norm for p=2.
>pnorm(v,2)
% We try to evaluate the Chebyshev polynomial of degree
% n at x, using the recursive formula T(n,x)=2*x*T(n-1,x)-T(n-2,x).
% 
% We could use a recursive definition, but is far more
% effective to make it in a loop.
>function t(n,x)
$if n==0; return ones(size(x)); endif;
$if n==1; return x; endif;
$a=1; b=x;
$loop 2 to n;
$c=2*x*b-a;
$a=b; b=c;
$end;
$return b
$endfunction
% You will wonder, why we return ones(size(x)) instead
% of simply 1. This is a principle: All functions in EULER
% should work for vector input. So the function must return
% a vector. However, our function does only work for non-vector
% n. This is for simplicity and effectiveness.
>x=-1:0.01:1; xplot(x,t(6,x)); title("t(6,x)"); wait(20);
% By the way, it is surprising how accurate the formula
% is. This is due to an error cancellation.
>longformat; t(60,0.9), cos(60*acos(0.9)),
% Let us try to get the Chebyshev polynomial itself.
>function T(n)
$if n==0; return [1]; endif;
$if n==1; return [0,1]; endif;
$a=[1]; b=[0,1];
$loop 2 to n;
$c=[0,2*b]-[a,0,0];
$a=b; b=c;
$end;
$return b
$endfunction
% T(n) returns now the coefficients of the n-th Chebyshev
% polynomial.
>T(4)
% We can evaluate it with polyval.
>xplot(x,polyval(T(10),x)); title("T(10)");
% However, this is not an accurate procedure for large
% n. (Compare with the result above).
>p=T(60); polyval(p,0.9)
% Though it is not efficient either, we can use an accurate
% solver for the evaluation of this polynomial. We see
% that the reason of the inaccuracy is due to the Horner
% scheme.
>xpolyval(p,0.9)
>
>
