From: <prn...@us...> - 2011-07-29 09:24:10
|
Revision: 8421 http://octave.svn.sourceforge.net/octave/?rev=8421&view=rev Author: prnienhuis Date: 2011-07-29 09:24:04 +0000 (Fri, 29 Jul 2011) Log Message: ----------- Removed call to funm at bottom as funm now call thfm Modified Paths: -------------- trunk/octave-forge/main/linear-algebra/inst/thfm.m Modified: trunk/octave-forge/main/linear-algebra/inst/thfm.m =================================================================== --- trunk/octave-forge/main/linear-algebra/inst/thfm.m 2011-07-28 23:04:56 UTC (rev 8420) +++ trunk/octave-forge/main/linear-algebra/inst/thfm.m 2011-07-29 09:24:04 UTC (rev 8421) @@ -1,138 +1,140 @@ -%USAGE y = thfm ( x, MODE ) -% -% trigonometric/hyperbolic functions of square matrix x -% -%MODE cos sin tan sec csc cot -% cosh sinh tanh sech csch coth -% acos asin atan asec acsc acot -% acosh asinh atanh asech acsch acoth -% sqrt log exp -% -%NOTE --- IMPORTANT --- -% This algorithm does NOT USE an eigensystem -% similarity transformation. It maps the MODE -% functions to functions of expm, logm and sqrtm, -% which are known to be robust with respect to -% non-diagonalizable ('defective') x -% -%EXA thfm( x ,'cos' ) calculates matrix cosinus -% EVEN IF input matrix x IS NOT DIAGONALIZABLE -% -%ASSOC expm, sqrtm, logm, funm -% Copyright (C) 2001 Rolf Fabian <fa...@tu...> -% 010213 -% published under current GNU GENERAL PUBLIC LICENSE - -% 2001-03-15 Paul Kienzle -% * extend with inverse functions and power functions -% * optimize handling of real input - -function y=thfm(x,M) - #% minimal arg check only - if nargin~=2||~ischar(M)||ischar(x) - usage ("y = thfm (x, MODE)"); - endif - - ## look for known functions of sqrt, log, exp - I = eye(size(x)); - match = 1; - len = length(M); - if len==3 - - if M=='cos', - if (isreal(x)) y = real( expm( i*x ) ); - else y = ( expm( i*x ) + expm( -i*x ) ) / 2; - endif - - elseif M=='sin', - if (isreal(x)) y = imag( expm( i*x ) ); - else y = ( expm( i*x ) - expm( -i*x ) ) / (2*i); - endif - - elseif M=='tan', - if (isreal(x)) t = expm( i*x ); y = imag(t)/real(t); - else t = expm( -2*i*x ); y = -i*(I-t)/(I+t); - endif - - elseif M=='cot', % == cos/sin - if (isreal(x)) t = expm( i*x ); y = real(t)/imag(t); - else t = expm( -2*i*x ); y = i*(I+t)/(I-t); - endif - - elseif M=='sec', - if (isreal(x)) y = inv( real(expm(i*x)) ); - else y = inv( expm(i*x)+expm(-i*x) )*2 ; - endif - - elseif M=='csc', - if (isreal(x)) y = inv( imag(expm(i*x)) ); - else y = inv( expm(i*x)-expm(-i*x) )*2i; - endif - - elseif M=='log', y = logm(x); - - elseif M=='exp', y = expm(x); - - else match = 0; - - endif - - elseif len==4 - - if M=='cosh', y = ( expm(x)+expm(-x) )/2; - - elseif M=='sinh', y = ( expm(x)-expm(-x) )/2; - - elseif M=='tanh' t = expm( -2*x ); y = (I - t)/(I + t); - - elseif M=='coth', t = expm( -2*x ); y = (I + t)/(I - t); - - elseif M=='sech', y = 2 * inv( expm(x) + expm(-x) ); - - elseif M=='csch', y = 2 * inv( expm(x) - expm(-x) ); - - elseif M=='asin', y = -i * logm( i*x + sqrtm(I - x*x) ); - - elseif M=='acos', y = i * logm( x - i*sqrtm(I - x*x) ); - - elseif M=='atan', y = -i/2 * logm( (I + i*x)/(I - i*x) ); - - elseif M=='acot', y = i/2 * logm( (I + i*x)/(i*x - I) ); - - elseif M=='asec', y = i * logm( ( I - sqrtm(I - x*x) ) / x ); - - elseif M=='acsc', y = -i * logm( i*( I + sqrtm(I - x*x) ) / x ); - - elseif M=='sqrt', y = sqrtm(x); - - else match = 0; - - end - - elseif len==5 - - if M=='asinh', y = logm( x + sqrtm (x*x + I) ); - - elseif M=='acosh', y = logm( x + sqrtm (x*x - I) ); - - elseif M=='atanh', y = logm( (I + x)/(I - x) ) / 2; - - elseif M=='acoth', y = logm( (I + x)/(x - I) ) / 2; - - elseif M=='asech', y = logm( (I + sqrtm (I - x*x)) / x ); - - elseif M=='acsch', y = logm( (I + sqrtm (I + x*x)) / x ); - - else match = 0; - - endif - - else match = 0; - - endif - - ## if no known function found, use generic solver - if (match == 0) - y = funm( x, M ); - endif -endfunction +%USAGE y = thfm ( x, MODE ) +% +% trigonometric/hyperbolic functions of square matrix x +% +%MODE cos sin tan sec csc cot +% cosh sinh tanh sech csch coth +% acos asin atan asec acsc acot +% acosh asinh atanh asech acsch acoth +% sqrt log exp +% +%NOTE --- IMPORTANT --- +% This algorithm does NOT USE an eigensystem +% similarity transformation. It maps the MODE +% functions to functions of expm, logm and sqrtm, +% which are known to be robust with respect to +% non-diagonalizable ('defective') x +% +%EXA thfm( x ,'cos' ) calculates matrix cosinus +% EVEN IF input matrix x IS NOT DIAGONALIZABLE +% +%ASSOC expm, sqrtm, logm, funm +% Copyright (C) 2001 Rolf Fabian <fa...@tu...> +% 010213 +% published under current GNU GENERAL PUBLIC LICENSE + +% 2001-03-15 Paul Kienzle +% * extend with inverse functions and power functions +% * optimize handling of real input +% 2011-03-27 Philip Nienhuis +% * Dropped call to funm at bottom (as funm now calls thfm...) + +function y=thfm(x,M) + #% minimal arg check only + if nargin~=2||~ischar(M)||ischar(x) + usage ("y = thfm (x, MODE)"); + endif + + ## look for known functions of sqrt, log, exp + I = eye(size(x)); + match = 1; + len = length(M); + if len==3 + + if M=='cos', + if (isreal(x)) y = real( expm( i*x ) ); + else y = ( expm( i*x ) + expm( -i*x ) ) / 2; + endif + + elseif M=='sin', + if (isreal(x)) y = imag( expm( i*x ) ); + else y = ( expm( i*x ) - expm( -i*x ) ) / (2*i); + endif + + elseif M=='tan', + if (isreal(x)) t = expm( i*x ); y = imag(t)/real(t); + else t = expm( -2*i*x ); y = -i*(I-t)/(I+t); + endif + + elseif M=='cot', % == cos/sin + if (isreal(x)) t = expm( i*x ); y = real(t)/imag(t); + else t = expm( -2*i*x ); y = i*(I+t)/(I-t); + endif + + elseif M=='sec', + if (isreal(x)) y = inv( real(expm(i*x)) ); + else y = inv( expm(i*x)+expm(-i*x) )*2 ; + endif + + elseif M=='csc', + if (isreal(x)) y = inv( imag(expm(i*x)) ); + else y = inv( expm(i*x)-expm(-i*x) )*2i; + endif + + elseif M=='log', y = logm(x); + + elseif M=='exp', y = expm(x); + + else match = 0; + + endif + + elseif len==4 + + if M=='cosh', y = ( expm(x)+expm(-x) )/2; + + elseif M=='sinh', y = ( expm(x)-expm(-x) )/2; + + elseif M=='tanh' t = expm( -2*x ); y = (I - t)/(I + t); + + elseif M=='coth', t = expm( -2*x ); y = (I + t)/(I - t); + + elseif M=='sech', y = 2 * inv( expm(x) + expm(-x) ); + + elseif M=='csch', y = 2 * inv( expm(x) - expm(-x) ); + + elseif M=='asin', y = -i * logm( i*x + sqrtm(I - x*x) ); + + elseif M=='acos', y = i * logm( x - i*sqrtm(I - x*x) ); + + elseif M=='atan', y = -i/2 * logm( (I + i*x)/(I - i*x) ); + + elseif M=='acot', y = i/2 * logm( (I + i*x)/(i*x - I) ); + + elseif M=='asec', y = i * logm( ( I - sqrtm(I - x*x) ) / x ); + + elseif M=='acsc', y = -i * logm( i*( I + sqrtm(I - x*x) ) / x ); + + elseif M=='sqrt', y = sqrtm(x); + + else match = 0; + + end + + elseif len==5 + + if M=='asinh', y = logm( x + sqrtm (x*x + I) ); + + elseif M=='acosh', y = logm( x + sqrtm (x*x - I) ); + + elseif M=='atanh', y = logm( (I + x)/(I - x) ) / 2; + + elseif M=='acoth', y = logm( (I + x)/(x - I) ) / 2; + + elseif M=='asech', y = logm( (I + sqrtm (I - x*x)) / x ); + + elseif M=='acsch', y = logm( (I + sqrtm (I + x*x)) / x ); + + else match = 0; + + endif + + else match = 0; + + endif + + ## if no known function found, issue warning + if (match == 0) + warning ("thfm doesn't support function M - try to use funm instead"); + endif +endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <car...@us...> - 2011-10-21 14:30:00
|
Revision: 8808 http://octave.svn.sourceforge.net/octave/?rev=8808&view=rev Author: carandraug Date: 2011-10-21 14:29:54 +0000 (Fri, 21 Oct 2011) Log Message: ----------- thfm: wrote help text in texinfo Modified Paths: -------------- trunk/octave-forge/main/linear-algebra/inst/thfm.m Modified: trunk/octave-forge/main/linear-algebra/inst/thfm.m =================================================================== --- trunk/octave-forge/main/linear-algebra/inst/thfm.m 2011-10-21 14:15:50 UTC (rev 8807) +++ trunk/octave-forge/main/linear-algebra/inst/thfm.m 2011-10-21 14:29:54 UTC (rev 8808) @@ -16,29 +16,27 @@ ## along with Octave; see the file COPYING. If not, see ## <http://www.gnu.org/licenses/>. -#%USAGE y = thfm ( x, MODE ) -#% -#% trigonometric/hyperbolic functions of square matrix x -#% -#%MODE cos sin tan sec csc cot -#% cosh sinh tanh sech csch coth -#% acos asin atan asec acsc acot -#% acosh asinh atanh asech acsch acoth -#% sqrt log exp -#% -#%NOTE --- IMPORTANT --- -#% This algorithm does NOT USE an eigensystem -#% similarity transformation. It maps the MODE -#% functions to functions of expm, logm and sqrtm, -#% which are known to be robust with respect to -#% non-diagonalizable ('defective') x -#% -#%EXA thfm( x ,'cos' ) calculates matrix cosinus -#% EVEN IF input matrix x IS NOT DIAGONALIZABLE -#% -#%ASSOC expm, sqrtm, logm, funm +## -*- texinfo -*- +## @deftypefn{Function File} {@var{y} =} thfm (@var{x}, @var{mode}) +## Trigonometric/hyperbolic functions of square matrix @var{x}. +## +## @var{mode} must be the name of a function. Valid functions are 'sin', 'cos', +## 'tan', 'sec', 'csc', 'cot' and all their inverses and/or hyperbolic variants, +## and 'sqrt', 'log' and 'exp'. +## +## The code @code{thfm( x ,'cos' )} calculates matrix cosinus @emph{even if} input +## matrix @var{x} is @emph{not} diagonalizable. +## +## @heading{Important note} +## This algorithm does @emph{not use} an eigensystem similarity transformation. It +## maps the @var{mode} functions to functions of @code{expm}, @code{logm} and +## @code{sqrtm}, which are known to be robust with respect to non-diagonalizable +## ('defective') @var{x}. +## +## @seealso{funm} +## end deftypefn -function y=thfm(x,M) +function y = thfm (x,M) #% minimal arg check only if ( nargin ~= 2 || ~ischar (M) || ischar (x) ) print_usage; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <car...@us...> - 2011-10-21 14:51:24
|
Revision: 8809 http://octave.svn.sourceforge.net/octave/?rev=8809&view=rev Author: carandraug Date: 2011-10-21 14:51:18 +0000 (Fri, 21 Oct 2011) Log Message: ----------- thfm: rewrite of function with switch statement Modified Paths: -------------- trunk/octave-forge/main/linear-algebra/inst/thfm.m Modified: trunk/octave-forge/main/linear-algebra/inst/thfm.m =================================================================== --- trunk/octave-forge/main/linear-algebra/inst/thfm.m 2011-10-21 14:29:54 UTC (rev 8808) +++ trunk/octave-forge/main/linear-algebra/inst/thfm.m 2011-10-21 14:51:18 UTC (rev 8809) @@ -1,6 +1,7 @@ ## Copyright (C) 2001 Rolf Fabian <fa...@tu...> ## Copyright (C) 2001 Paul Kienzle <pki...@us...> ## Copyright (C) 2011 Philip Nienhuis <pr....@hc...> +## Copyright (C) 2011 Carnë Draug <car...@gm...> ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -37,111 +38,62 @@ ## end deftypefn function y = thfm (x,M) - #% minimal arg check only - if ( nargin ~= 2 || ~ischar (M) || ischar (x) ) + ## minimal arg check only + if ( nargin != 2 || !ischar (M) || ischar (x) ) print_usage; endif ## look for known functions of sqrt, log, exp - I = eye(size(x)); - match = 1; - len = length(M); - if len==3 - - if M=='cos', - if (isreal(x)) y = real( expm( i*x ) ); - else y = ( expm( i*x ) + expm( -i*x ) ) / 2; + I = eye (size (x)); + + switch (M) + case {'cos'} + if (isreal(x)) y = real( expm( i*x ) ); + else y = ( expm( i*x ) + expm( -i*x ) ) / 2; endif - - elseif M=='sin', - if (isreal(x)) y = imag( expm( i*x ) ); - else y = ( expm( i*x ) - expm( -i*x ) ) / (2*i); + case {'sin'} + if (isreal(x)) y = imag( expm( i*x ) ); + else y = ( expm( i*x ) - expm( -i*x ) ) / (2*i); endif - - elseif M=='tan', - if (isreal(x)) t = expm( i*x ); y = imag(t)/real(t); - else t = expm( -2*i*x ); y = -i*(I-t)/(I+t); + case {'tan'} + if (isreal(x)) t = expm( i*x ); y = imag(t)/real(t); + else t = expm( -2*i*x ); y = -i*(I-t)/(I+t); endif - - elseif M=='cot', % == cos/sin - if (isreal(x)) t = expm( i*x ); y = real(t)/imag(t); - else t = expm( -2*i*x ); y = i*(I+t)/(I-t); + case {'cot'} + if (isreal(x)) t = expm( i*x ); y = real(t)/imag(t); + else t = expm( -2*i*x ); y = i*(I+t)/(I-t); endif - - elseif M=='sec', - if (isreal(x)) y = inv( real(expm(i*x)) ); - else y = inv( expm(i*x)+expm(-i*x) )*2 ; + case {'sec'} + if (isreal(x)) y = inv( real(expm(i*x)) ); + else y = inv( expm(i*x)+expm(-i*x) )*2 ; endif - - elseif M=='csc', - if (isreal(x)) y = inv( imag(expm(i*x)) ); - else y = inv( expm(i*x)-expm(-i*x) )*2i; + case {'csc'} + if (isreal(x)) y = inv( imag(expm(i*x)) ); + else y = inv( expm(i*x)-expm(-i*x) )*2i; endif + case {'log'} y = logm(x); + case {'exp'} y = expm(x); + case {'cosh'} y = ( expm(x)+expm(-x) )/2; + case {'sinh'} y = ( expm(x)-expm(-x) )/2; + case {'tanh'} t = expm( -2*x ); y = (I - t)/(I + t); + case {'coth'} t = expm( -2*x ); y = (I + t)/(I - t); + case {'sech'} y = 2 * inv( expm(x) + expm(-x) ); + case {'csch'} y = 2 * inv( expm(x) - expm(-x) ); + case {'asin'} y = -i * logm( i*x + sqrtm(I - x*x) ); + case {'acos'} y = i * logm( x - i*sqrtm(I - x*x) ); + case {'atan'} y = -i/2 * logm( (I + i*x)/(I - i*x) ); + case {'acot'} y = i/2 * logm( (I + i*x)/(i*x - I) ); + case {'asec'} y = i * logm( ( I - sqrtm(I - x*x) ) / x ); + case {'acsc'} y = -i * logm( i*( I + sqrtm(I - x*x) ) / x ); + case {'sqrt'} y = sqrtm(x); + case {'asinh'} y = logm( x + sqrtm (x*x + I) ); + case {'acosh'} y = logm( x + sqrtm (x*x - I) ); + case {'atanh'} y = logm( (I + x)/(I - x) ) / 2; + case {'acoth'} y = logm( (I + x)/(x - I) ) / 2; + case {'asech'} y = logm( (I + sqrtm (I - x*x)) / x ); + case {'acsch'} y = logm( (I + sqrtm (I + x*x)) / x ); + otherwise + error ("thfm doesn't support function %s - try to use funm instead.", M); + endswitch - elseif M=='log', y = logm(x); - - elseif M=='exp', y = expm(x); - - else match = 0; - - endif - - elseif len==4 - - if M=='cosh', y = ( expm(x)+expm(-x) )/2; - - elseif M=='sinh', y = ( expm(x)-expm(-x) )/2; - - elseif M=='tanh' t = expm( -2*x ); y = (I - t)/(I + t); - - elseif M=='coth', t = expm( -2*x ); y = (I + t)/(I - t); - - elseif M=='sech', y = 2 * inv( expm(x) + expm(-x) ); - - elseif M=='csch', y = 2 * inv( expm(x) - expm(-x) ); - - elseif M=='asin', y = -i * logm( i*x + sqrtm(I - x*x) ); - - elseif M=='acos', y = i * logm( x - i*sqrtm(I - x*x) ); - - elseif M=='atan', y = -i/2 * logm( (I + i*x)/(I - i*x) ); - - elseif M=='acot', y = i/2 * logm( (I + i*x)/(i*x - I) ); - - elseif M=='asec', y = i * logm( ( I - sqrtm(I - x*x) ) / x ); - - elseif M=='acsc', y = -i * logm( i*( I + sqrtm(I - x*x) ) / x ); - - elseif M=='sqrt', y = sqrtm(x); - - else match = 0; - - end - - elseif len==5 - - if M=='asinh', y = logm( x + sqrtm (x*x + I) ); - - elseif M=='acosh', y = logm( x + sqrtm (x*x - I) ); - - elseif M=='atanh', y = logm( (I + x)/(I - x) ) / 2; - - elseif M=='acoth', y = logm( (I + x)/(x - I) ) / 2; - - elseif M=='asech', y = logm( (I + sqrtm (I - x*x)) / x ); - - elseif M=='acsch', y = logm( (I + sqrtm (I + x*x)) / x ); - - else match = 0; - - endif - - else match = 0; - - endif - - ## if no known function found, issue warning - if (match == 0) - warning ("thfm doesn't support function M - try to use funm instead"); - endif endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <car...@us...> - 2011-11-02 18:00:40
|
Revision: 8940 http://octave.svn.sourceforge.net/octave/?rev=8940&view=rev Author: carandraug Date: 2011-11-02 18:00:33 +0000 (Wed, 02 Nov 2011) Log Message: ----------- thfm: fix error in help text Modified Paths: -------------- trunk/octave-forge/main/linear-algebra/inst/thfm.m Modified: trunk/octave-forge/main/linear-algebra/inst/thfm.m =================================================================== --- trunk/octave-forge/main/linear-algebra/inst/thfm.m 2011-11-02 17:39:35 UTC (rev 8939) +++ trunk/octave-forge/main/linear-algebra/inst/thfm.m 2011-11-02 18:00:33 UTC (rev 8940) @@ -25,17 +25,17 @@ ## 'tan', 'sec', 'csc', 'cot' and all their inverses and/or hyperbolic variants, ## and 'sqrt', 'log' and 'exp'. ## -## The code @code{thfm( x ,'cos' )} calculates matrix cosinus @emph{even if} input +## The code @code{thfm (x, 'cos')} calculates matrix cosinus @emph{even if} input ## matrix @var{x} is @emph{not} diagonalizable. ## -## @heading{Important note} -## This algorithm does @emph{not use} an eigensystem similarity transformation. It +## @emph{Important note}: +## This algorithm does @emph{not} use an eigensystem similarity transformation. It ## maps the @var{mode} functions to functions of @code{expm}, @code{logm} and ## @code{sqrtm}, which are known to be robust with respect to non-diagonalizable ## ('defective') @var{x}. ## ## @seealso{funm} -## end deftypefn +## @end deftypefn function y = thfm (x,M) ## minimal arg check only This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |