Symbolic package: Difference between revisions

From Octave
Jump to navigation Jump to search
(→‎Demos and usage examples: rework the evaluate-at-double example)
Line 4: Line 4:


=== Demos and usage examples ===
=== Demos and usage examples ===
* ''' I'm trying to substitute a double value into an expression.  How can I avoid getting "warning: Using rat() heuristics for double-precision input (is this what you wanted?)"
In general, you should be very careful when converting floating point ("doubles") to symbolic variables, that's why the warning is bothering you.
<source lang="octave">
## Demo of how to use a number (which was calculated in an octave
## variable) in a symbolic calculation, without getting a warning.
## use octave to calculate some number:
a = pi/2
## now do some work with the symbolic pkg
syms x
f = x * cos (x)
df = diff (f)
## Now we want to evaluate df at a:
# subs (df, x, a)    # this gives the "rats" warning (and gives a symbolic answer)
## So instead, try
dfh = function_handle (df)
dfh (a)
## And you can evaluate dfh at an array of "double" values:
dfh ([1.23 42.42 pi/2])
</source>


* '''Demo of Anonymous function to symbolic function and back to anonymous function and then the use of the interval pkg.'''
* '''Demo of Anonymous function to symbolic function and back to anonymous function and then the use of the interval pkg.'''
Line 99: Line 133:
  grid minor on  
  grid minor on  


</source>
* '''Demo of how to suppress a warning about converting from floating point numbers to symbolic numbers.
<source lang="octave">
## Demo of how to use a number (which was calculated in an octave
## variable) in a symbolic calculation, without getting a warning.
## use octave to calculate some number:
a=pi/2
## now do some work with the symbolic pkg
syms x
    f = x * cos(x)
    df = diff(f)
## Next get the number into a symbolic variable 
## convert to string first 
    aa=mat2str(a)
## and now to a symbolic variable.   
    ww=sym(aa)
## and now use it 
    vpa(subs(df, x, ww), 28)
</source>
</source>

Revision as of 19:57, 17 February 2017

The symbolic package is part of the octave-forge project.

Demos and usage examples

  • I'm trying to substitute a double value into an expression. How can I avoid getting "warning: Using rat() heuristics for double-precision input (is this what you wanted?)"

In general, you should be very careful when converting floating point ("doubles") to symbolic variables, that's why the warning is bothering you.

## Demo of how to use a number (which was calculated in an octave
## variable) in a symbolic calculation, without getting a warning.

## use octave to calculate some number:
 a = pi/2

## now do some work with the symbolic pkg
 syms x
 f = x * cos (x)
 df = diff (f)

## Now we want to evaluate df at a:

 # subs (df, x, a)     # this gives the "rats" warning (and gives a symbolic answer)

## So instead, try

 dfh = function_handle (df)

 dfh (a)

## And you can evaluate dfh at an array of "double" values:

 dfh ([1.23 42.42 pi/2])


  • Demo of Anonymous function to symbolic function and back to anonymous function and then the use of the interval pkg.
% this is just a formula to start with,
% have fun and change it if you want to.

f=@(x) x.^2 +3*x-1 + 5*x.*sin(x);

% the next 2 line take the Anonymous function into a symbolic formula

syms x;

ff=formula(f(x));

% now calculate the derivative of the function

ffd=diff(ff);

% and convert it back to an Anonymous function

df=function_handle(ffd)


% this uses the interval pkg. to find all the roots between -15 an 10 

fzero (f, infsup (-15, 10), df)

ans4×1 interval vector

    [-5.743488743719015, -5.743488743719013]
    [-3.0962279604822407, -3.09622796048224]
    [-0.777688831121563, -0.7776888311215626]
    [0.22911205809043574, 0.2291120580904359]


  • Demo of inputting a function at the input prompt and making an Anonymous function.
# This prog. shows how to take a
# string input and make it into an anonymous function
# this uses the symbolic pkg.
disp("Example input")
disp("x^2 + 3*x - 1 + 5*x*sin(x)")
str_fucn=input("please enter your function  ","s")
fucn_sym=sym(str_fucn)
f=function_handle(fucn_sym)
# now back to symbolic
syms x;
ff=formula(f(x));
% now calculate the derivative of the function 
ffd=diff(ff);
% and convert it back to an Anonymous function
df=function_handle(ffd)
% now lets do the second derivative
ffdd=diff(ffd);
ddf=function_handle(ffdd)
% and now plot them all 
x1=-2:.0001:2;
plot(x1,f(x1),x1,df(x1),x1,ddf(x1))
grid minor on
legend("f","f '", "f '' ")


  • Demo of ODE with a step input and initial conditions.
 ## This is a demo of a second order transfer function and a unit step input.
 ## in laplace we would have        1                       1
 ##                              _______________         *  _____
 ##                             s^2 + sqrt(2)*s +1           s
 ##
 ## So the denominator is s^3 + sqrt(2) * s^2 + s
 # and for laplace initial conditions area
 ##             t(0)=0 t'(0) =0  and the step has initial condition of  1
 ## so we set   t''(0)=1
 ## In the code we use diff(y,1)(0) == 0 to do t'(0)=0
 ##
 ## I know that all this can be done using the control pkg
 ## But I used this to verify that this solution is the
 ##   same as if I used the control pkg.
 ## With this damping ratio we should have a 4.321% overshoot.
 ##
 syms y(x) 
 de =diff(y, 3 ) +sqrt(2)*diff(y,2) + diff(y) == 0;
 f = dsolve(de, y(0) == 0, diff(y,1)(0) == 0 , diff(y,2)(0) == 1)
 ff=function_handle(rhs(f))
  x1=0:.01:10;
 y=ff(x1);
 plot(x1,y)
 grid minor on