如何在MATLAB中得到函数的导数?

时间:2012-03-20 01:15:08

标签: matlab

在现实生活中它是小菜一碟,但你如何在matlab中得到二次或三次函数的导数呢?

例如,A*x^3 + B*x^2 + C*x + D将为3*Ax^2 + 2*b*x + C

我想在matlab中得到这个,但我无法弄清楚如何:(

例如我尝试了这段代码,但是我得到了愚蠢的结果(也许我应该受到指责!):

>> x = [6 3 2 1]

x =

     6     3     2     1

>> xPrime = diff(x)

xPrime =

    -3    -1    -1

通常应该给[18 6 2] ?? 另外,我想知道你如何为数字范围做这件事。例如,我想要n = linspace(0,10,1000)

的上述示例的每个点的衍生物

更新 当然我可以手动执行此操作,但我真的很想知道如何使用matlab本身。

我现在正在做的是得到上面例子的切线,我这样做是有效的:

x = linspace(0,10,1000);
y=A*x.^3+B*x.^2+C*x + D;
plot(x,y);
hold on;
slop=3*A.*(Location^2)+2*B.*Location+C;
b=(A.*Location.^3)+(B.*Location.^2)+(C.*Location)+D;
y2=slop*(x-Location)+b;
plot(x,y2,'--r');
legend('Graph of the function','Tangent Line');
hold off;

我的意思是我应该在这一行中使用什么代替手工计算的衍生物:

slop=3*A.*(Location^2)+2*B.*Location+C;

谢谢!

4 个答案:

答案 0 :(得分:3)

您想查看Matlab的符号库(基于Maple引擎)。基本思想是你想要创建符号变量('syms'),然后象征性地区分这些表达式。然后,您可以在符号表达式和函数句柄之间进行转换,该函数句柄将在某些坐标值处评估符号表达式。有关语法,'syms'库等的说明,请参阅here

但在实际应用中,您通常需要为您处理的不同数学函数编写自己的软件函数。然后,只有在特殊情况下,您才能分析计算导数,在这些情况下,您将需要为衍生数学函数编写另一个独立的软件函数。符号库通常非常慢,它们(至少目前)是通过句柄生成实际函数的低效方法。

但是,如果您将使用的是多项式,那么这是一个特殊的情况,您应该能够编写一个通用的Matlab函数,该函数将系数列表和一系列值作为输入,并输出导数系数列表加上在这些值处评估的导数函数。这是一个例子:

 function [d_coeffs, d_vals] = compute_poly_derivative(in_coeffs, in_values)
 num_terms = length(in_coeffs)-1;
 max_power = num_terms;

 for ii=1:num_terms
     d_coeffs[ii] = in_coeffs[ii]*max_power;
     max_power = max_power - 1;
 end

 d_vals = polyval(d_coeffs,in_values);

答案 1 :(得分:3)

要获得多项式的导数,它本身就是一个多项式,使用Matlab的polyder()函数。这将多项式系数的标准表示作为矢量,并将其导数作为第二系数矢量返回。您可以像这样评估某个值p的多项式x的导数:

slop = polyval(polyder(p), x);

答案 2 :(得分:2)

您可以使用finite differences以数字方式执行此操作。 MATLAB有一个函数gradient,它包含一个二阶精确方案 - 见here

如果您正在寻求更高的准确性,您可以实施自己的更高阶订单方案。

希望这有帮助。

答案 3 :(得分:1)

diff给出了列表中连续元素之间的区别:3 - 6是-3,2 - 3是-1等等。

如果你有symbolic toolbox,你可以使用它。或者,如果您只需要多项式,那么自己编写它并不困难:

ds = poly .* fliplr(0:length(poly)-1);
ds = [0 ds(1:end-1)];

这只是将每个系数乘以其指数(fliplr反转列表),然后将指数向下移动一个(将列表元素向右移动一步)。

这为您提供了多项式的新表示。要在给定点x评估其中一个,请尝试

sum(poly .* x .^ fliplr(0:length(poly)-1))