Code Geas Coder
Code Geas Coder

Reputation: 1989

Calculate the n-th derivative in any point using Scilab

I am trying to evaluate a function in Scilab using the following steps:

x=poly(0,'x')
y=(x^18+x^11)^3 // function (the function is variable)
y1=derivat(y) // first derivate
y2=derivat(y) //second derivate
y3=derivat(y) //third derivate

I need evaluate the 3 derivatives in any point.

I know the function: evstr(expression) but it does not work with the return value of the derivative.

I try to use: string(y) but it returns something strange.

How can to do it, to cast the return of derivat to string to evaluate with evstr or how can I evaluate the n-th derivative in any point using Scilab.

Upvotes: 4

Views: 3412

Answers (4)

Stéphane Mottelet
Stéphane Mottelet

Reputation: 3014

To evaluate numerical derivatives of almost any kind of function (of one or sereval variables) up to machine precision (you won't get better results if you evaluate symbolic expressions obtained by hand), you can use the complex step method (google these terms you will have a bunch of references). For example:

function y = f(x)
  s = poly(0,'s');
  p = (s-s^2)^3;
  y = horner(p,x).*exp(-x.^2);
end

x=linspace(-1,1,100);
d = imag(f(x+complex(0,1e-100)))/1e-100;

true_d = exp(-x.^2).*(-1+x).^2.*x^2.*(3-6*x-2*x.^2+2.*x^3)

disp(max(abs(d-true_d)))

--> disp(max(abs(d-true_d)))

   1.776D-15

Upvotes: 1

EmmanuelMess
EmmanuelMess

Reputation: 1092

I found a way:

function y = deriva(f, v, n, h)
    deff("y = DF0(x)", "y="+f)
    if n == 0 then
        y = DF0(v);
     else
        for i=1:(n-1)
            deff("y=DF"+string(i)+"(x)", "y=numderivative(DF"+string(i-1)+",x,"+string(h)+",4)");
        end
        deff("y=DFN(x)", "y=numderivative(DF"+string(n-1)+",x,"+string(h)+",4)");
        y = DFN(v);
    end
endfunction

disp(deriva("x.*x", 3, 2, 0.0001));

This correctly calculates numerical derivatives of nth order. But it needs to have the function passed as a string. Errors can get pretty large, and time to compute tends to go up fast as a function of n.

Upvotes: 0

Dariel Rudt
Dariel Rudt

Reputation: 38

This is the closest I got to a solution to this problem.

He proposes using:

old = 'f';
for i=1:n
    new = 'd'+string(i)+'f';
    deff('y='+new+'(x)','y=numderivative('+old+',x)');
    old=new;
end

I know, it's horrible, but I think there is no better solution, at least in Scilab.

Upvotes: 0

user3717023
user3717023

Reputation:

To evaluate a symbolic polynomial at a particular point or points, use the horner command. Example:

t = 0:0.1:1
v1 = horner(y1, t)
plot(t, v1)

Upvotes: 0

Related Questions