在现实生活中它是小菜一碟,但你如何在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;
谢谢!
答案 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))