【发布时间】:2020-09-06 08:12:20
【问题描述】:
假设我有一个简单的函数句柄定义为
Eq.1 F = @(t,A) A(1) + A(2)*t + A(3)*t^2;
而我想从F的微分中定义另一个函数句柄,比如
Eq.2: dF = @(t,A) diff( F(t,A), t );
但是,似乎禁止在某些特定的t 上评估dF,例如dF(0,A),并且发生错误
“第二个参数必须是变量或变量”
然后我尝试使用如下所示的表达式:
Eq.3 dF(t,A) = diff( F(t,A), t );
这样,它允许在t=0 直接评估
但是,它必须采用dF( 0, A(1), A(2), A(3) ) 的形式来评估Eq.3 而不是dF(0,A)
我的问题是:
有没有一种更简单的方法可以使用直接形式 dF(0,A) 而不是 dF(0, A(1), ... ) 进行这种直接评估
为了省去在dF( 0, A(1), A(2), ..., A(100) ) 中逐一键入A(...) 的工作,假设有100 个参数
PS:
不使用matlabFunction
测试代码如下:
syms t A a0 a1 a2
A = [a0,a1,a2];
F = @(t,A) A(1) + A(2)*t + A(3)*t^2;
dF1 = @(t,A) diff( F(t,A), t );
dF2(t,A) = diff( F(t,A), t ); % Same as using symfun
dF3 = matlabFunction( diff( F(t,A), t ), 'Vars', {t,A} );
现在,在命令窗口中输入,
>> dF1(t,A)
>> ans = a1 + 2*a2*t
>> dF1(0,A)
>> ans = a0 % This is wrong
>> dF3(t,A)
>> ans = a1 + 2*a2*t
>> dF3(0,A)
>> ans = a1 % This is correct
>> dF2(t,A)
Error using symfun/subsref (line 141)
Symbolic function expected 4 inputs and received 2.
>> dF2(t,a0,a1,a2)
>> ans = a1 + 2*a2*t
>> dF2(0,a0,a1,a2)
>> ans = a1 % This is correct
很明显,只有dF2是一个符号函数。
但是,input 的形式似乎不是那么友好。
matlabFunction 的运行速度比symfun 慢得多,并且@(x,A) diff(...) 不能接受数值结果。这就是为什么我想使用symfun 来定义一个参数太多的函数。然而符号函数的输入形式似乎并不那么直接和友好。
【问题讨论】:
-
有两个不同的
diff函数。符号微分需要使用syms参数调用,以便调用 Symbic Toolbox 中的diff函数。当使用数字输入调用时,它会计算数组中后续元素之间的差异。 -
@CrisLuengo 抱歉,我没有说清楚。 Eq.3 是可用的,但我必须输入 dF( 1.0, A(1), A(2), ... ) 来获得结果,而不是直接输入 dF( 1.0, A )。我的问题是可以避免键入 A 的所有元素,而不使用 matlabFunction(花费太多时间)
-
我不明白你在说什么,也不明白为什么你必须输入 A 的所有元素。能否请edit 你的帖子包含一些实际代码?这将使谈论这个问题变得容易得多。
-
@CrisLuengo 我添加了一些测试代码。我正在使用 MATLAB 2015b,不知道最新版本是否出现类似问题。我只想以一种有效的方式定义一个具有许多参数的符号函数,并使其更容易评估具有太多输入的函数。非常感谢你教我!
-
我已经重写了我的答案。
标签: matlab symbolic-math derivative