这是因为diff(f,x,i) 的计算结果为零。使用 symsum 时,您需要注意,与任何 Matlab 函数一样,输入参数将在传入之前进行评估。只需使用 for 循环(sym/diff 在第三个参数中未矢量化 - 请参阅下面):
syms x y;
f(x) = sin(x);
n = 0:2;
y = 0;
for i = n
y = y+x^i/factorial(i)*diff(f,x,i);
end
或者,您可以尝试这种形式(在这种情况下,只有三个索引,上面的可能会更有效):
syms x y;
f(x) = sin(x);
n = 0:2; % Increasing orders of differentiation
y = diff(f,x,n(1));
yi = [y(x) zeros(1,length(n)-1)]; % To index into array, yi cannot be symfun
for i = 2:length(n)
% Calculate next derivative from previous
yi(i) = diff(yi(i-1),x,n(i)-n(i-1));
end
% Convert yi back to symfun so output is symfun
y = sum(x.^n./factorial(n).*symfun(yi,x));
即使i 是符号,为什么diff(f,x,i) 的计算结果为零?来自sym/diff 的文档:
diff(S,n),对于正整数 n,将 S n 次微分。
diff(S,'v',n) 和 diff(S,n,'v') 也是可以接受的。
换句话说,该函数不支持使用符号变量来指定积分顺序。订单n(或您的代码中的i)也仅限于标量。不幸的是,MuPAD 的相关功能也有类似的限制。
在我看来,sym/diff 如果有这个限制,应该抛出一个错误而不是返回垃圾。我建议您通过 The MathWorks file a service request 报告此问题。您还可以请求更新函数以处理符号变量的积分输入顺序。