1

我正在尝试使用创建的符号向量来区分以下符号表达式,但我不断收到错误。也就是说,我想要 df/dx1、df/dx2 和 df/dx3。这是我尝试过的:

>> x = sym('x', [3 1])

x =

 x1
 x2
 x3

>> symbolic = 0.5*transpose(x)*eye(1)*x + [1 1 1]*x

symbolic =

x1^2/2 + x1 + x2^2/2 + x2 + x3^2/2 + x3

>> diff(symbolic, x)
Error using mupadmex
Error in MuPAD command: Invalid argument. [contains]

  Evaluating: (Dom::Matrix(Dom::ExpressionField()))::_mult1

Error in sym/diff (line 44)
    R = mupadmex('symobj::diff', S.s, x.s, int2str(n));

>> diff(symbolic, x.x1)
Error using sym/subsref
Too many output arguments.

任何帮助将不胜感激。谢谢!

4

1 回答 1

2

您可以尝试以下两个选项之一:

% option 1
x = sym('x', [3 1]);
f = 0.5*transpose(x)*eye(1)*x + [1 1 1]*x;

for i=1:3
    Df(1,i) = diff(f, x(i));
end

% I do not like this option because I do not know 
% how to evaluate the expressions with numeric values
x(1) = 1;
eval(Df)

我更喜欢“选项 2”,因为它更容易评估表达式。

% option 2
syms x1 x2 x3 real; % 'real' fixes x1 x2 x3 as real numbers (not complex ones)
x = [x1 x2 x3]'; % '
f = 0.5*transpose(x)*eye(1)*x + [1 1 1]*x;

for i=1:3
    eval(['Df(1,i) = diff(f,x',num2str(i),');']);
end

% To eval at a certain value
x1 = 1;
x2 = 2;
x3 = 3;
eval(Df)

我认为 eval 只有我上面使用的两个功能:

  1. 将符号表达式评估为符号变量的特定值,就像我写 eval(Df) 时一样。
  2. 您可以使用 eval 评估以字符串形式编写的 matlab 命令,就像您将其编写为普通代码一样。试试这个看看我的意思:

    a = 1; % 将 a 的值设置为 1

    评估('a = 2');% 将 a 的值更改为 2

    eval(['a = ',num2str(5)]); % 将 a 的值设置为 5;

希望这可以帮助,

于 2012-10-13T21:09:07.143 回答