我正在尝试使用以下步骤评估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个导数。
答案 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的增加而迅速增加。