导数符号符号的Matlab变化
Matlab change in symbolic notation of derivative
我最近将 Matlab 从 2013b 升级到 2019a(是的,我知道,发生了很多变化……但软件成本没有变化)。我有一些 "legacy code" 大量使用符号工具箱。似乎引起大问题的一件事是符号的变化。我认为这个问题最好通过例子来呈现:
2013
>> F(x) = sym('F(x)');
>> subs(diff(F,x),x,1)
ans(x) =
D(F)(1)
2019
>> F(x) = str2sym('F(x)');
>> subs(diff(F,x),x,1)
ans(x) =
subs(diff(F(x), x), x, 1)
在 2019 年,F(x) = sym('F(x)');
不起作用,我被告知切换到 F(x) = str2sym('F(x)');
,这似乎按预期执行操作,但符号正在破坏我的代码。
有没有办法挽救旧的符号,或者我是否必须重写我的代码?
编辑
好评论.....这怎么会破坏我的代码?我使用符号工具来求解方程,然后根据它们的结构解析它们。例如,如果一个表达式有一个三阶导数,我会把它放在 A 组。如果它有一个 7 导数,我会把它放在 B 组。在 2013 年,很容易解析高阶导数......一个三次衍生品在 2019 年看起来像这样 D(D(D(F)))(x)
它看起来像这样 diff(F(x), x, x, x)
。我还发现 2019 混合了它的符号。例如
F(x) = str2sym('F(x+dx)')
F(x) =
F(dx + x)
>> diff(F,x,3)
ans(x) =
D(D(D(F)))(dx + x)
在这一点上,我认为这最终将成为一个接一个的补丁修复。如果符号是可变的,那么解析符号表达式可能不是最好的主意。我希望可能会有 "yeah, go to preferences and select..."
如果添加 +dx
之类的内容会使 2019 年的转换符号变为 D
,也许您可以始终执行类似的操作,然后替换掉多余的内容?我没有符号工具箱,所以无法试验,只是一个想法。
例子
将 F(x) = str2sym('F(x)');
更改为
F(x) = str2sym('F(x+dx)');
然后使用
subs(diff(F,x),x + dx,1)
其中 returns D(F)(1)
与 subs(diff(F(x), x), x, 1)
同义
(需要 MATLAB 2019a 或更高版本)
不是关于如何恢复旧语法的答案,而是针对您描述的问题的答案。以下是我的解决方法:
%some example input
syms x f(x)
g=diff(f,x,3)+8
%find the expression with `diff` and get its arguments
a=children(findSymType(g,'diff'))
这将return[ f(x), x, x, x]
,这意味着你所要做的就是扔掉第一个元素并计算x
我最近将 Matlab 从 2013b 升级到 2019a(是的,我知道,发生了很多变化……但软件成本没有变化)。我有一些 "legacy code" 大量使用符号工具箱。似乎引起大问题的一件事是符号的变化。我认为这个问题最好通过例子来呈现:
2013
>> F(x) = sym('F(x)');
>> subs(diff(F,x),x,1)
ans(x) =
D(F)(1)
2019
>> F(x) = str2sym('F(x)');
>> subs(diff(F,x),x,1)
ans(x) =
subs(diff(F(x), x), x, 1)
在 2019 年,F(x) = sym('F(x)');
不起作用,我被告知切换到 F(x) = str2sym('F(x)');
,这似乎按预期执行操作,但符号正在破坏我的代码。
有没有办法挽救旧的符号,或者我是否必须重写我的代码?
编辑
好评论.....这怎么会破坏我的代码?我使用符号工具来求解方程,然后根据它们的结构解析它们。例如,如果一个表达式有一个三阶导数,我会把它放在 A 组。如果它有一个 7 导数,我会把它放在 B 组。在 2013 年,很容易解析高阶导数......一个三次衍生品在 2019 年看起来像这样 D(D(D(F)))(x)
它看起来像这样 diff(F(x), x, x, x)
。我还发现 2019 混合了它的符号。例如
F(x) = str2sym('F(x+dx)')
F(x) =
F(dx + x)
>> diff(F,x,3)
ans(x) =
D(D(D(F)))(dx + x)
在这一点上,我认为这最终将成为一个接一个的补丁修复。如果符号是可变的,那么解析符号表达式可能不是最好的主意。我希望可能会有 "yeah, go to preferences and select..."
如果添加 +dx
之类的内容会使 2019 年的转换符号变为 D
,也许您可以始终执行类似的操作,然后替换掉多余的内容?我没有符号工具箱,所以无法试验,只是一个想法。
例子
将 F(x) = str2sym('F(x)');
更改为
F(x) = str2sym('F(x+dx)');
然后使用
subs(diff(F,x),x + dx,1)
其中 returns D(F)(1)
与 subs(diff(F(x), x), x, 1)
(需要 MATLAB 2019a 或更高版本)
不是关于如何恢复旧语法的答案,而是针对您描述的问题的答案。以下是我的解决方法:
%some example input
syms x f(x)
g=diff(f,x,3)+8
%find the expression with `diff` and get its arguments
a=children(findSymType(g,'diff'))
这将return[ f(x), x, x, x]
,这意味着你所要做的就是扔掉第一个元素并计算x