【问题标题】:Problems with symsum() function in Symbolic Math ToolboxSymbolic Math Toolbox 中 symsum() 函数的问题
【发布时间】:2015-04-25 22:27:56
【问题描述】:

我在使用 MATLAB 符号数学工具箱中的 symsum 函数时遇到了一些问题。我的代码应该返回:

ans = sin(x) + x*cos(x) - x^2 / 2 * sin(x)

我认为这与符号变量有关,但我是 MATLAB 新手,因此不胜感激。

这是我的代码:

syms x i;
f(x) = sin(x);

symsum(x^i/factorial(i)*diff(f,x,i), i, 0, 2)

返回0,而不是上面指出的正确结果。

【问题讨论】:

    标签: matlab math symbolic-math toolbox


    【解决方案1】:

    这是因为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 报告此问题。您还可以请求更新函数以处理符号变量的积分输入顺序。

    【讨论】:

    • 在应用 diff() 函数之前是否可以将符号 i,j 变量“转换”为双精度或整数?它会是这样的 symsum(x^i/factorial(i)*diff(f(x), double(i)), 0, 2)
    • @hectorhfm:这实际上就是我的答案中的for 循环所做的。您会发现简单地将符号变量 i 转换为 double 会导致错误。这是因为diff(f(x), double(i))i 被替换为symsum 提供的数值之前仍然首先被求值。您不能将任意符号变量(有名称但没有值)转换为任何数字格式,因为它是未定义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多