使用Scilab计算任意点的第n个导数

时间:2015-03-10 02:08:49

标签: scilab

我正在尝试使用以下步骤评估Scilab中的函数:

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

我需要在任何方面评估3个衍生物。

我知道函数:evstr(expression)但它不适用于派生的返回值。

我尝试使用:string(y)但它会返回一些奇怪的东西。

如何做到这一点,将derivat的返回值转换为字符串以使用evstr进行评估,或者如何使用Scilab评估任何点的第n个导数。

4 个答案:

答案 0 :(得分:1)

要评估几乎任何类型的函数(一个或一个或多个变量)的数值导数到机器精度(如果您评估通过手工获得的符号表达式都不会得到更好的结果),则可以使用复杂的步进方法(谷歌这些条款,你将有很多参考)。例如:

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

答案 1 :(得分:0)

要评估特定点或多个点的符号多项式,请使用horner命令。示例:

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

答案 2 :(得分:0)

This是我最接近解决此问题的方法。

他建议使用:

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

我知道,这很可怕,但我认为没有更好的解决方案,至少在Scilab中。

答案 3 :(得分:0)

我找到了一种方法:

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));

这将正确计算n阶数值导数。但是它需要将函数作为字符串传递。误差可能会变得非常大,并且计算时间往往会随着n的增加而迅速增加。