Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数导数在数值上已知时的MATLAB微分_Matlab - Fatal编程技术网

函数导数在数值上已知时的MATLAB微分

函数导数在数值上已知时的MATLAB微分,matlab,Matlab,我想在MATLAB中区分以下函数wrt: T(e(x(T),T)/p(T)) 我的问题是我在数值上知道x的导数(我在一种odefun中)。 我想使用diff使我的代码可以推广到高阶导数,但是x的导数现在是常数。我还希望所有这些都是在一个匿名函数中,我可以进行微分,并相应地替换所需的时间和x的导数,这样我就不必为系统的每个状态编写多个函数 我的代码如下: syms q x star; qd=symfun(90*pi/180+30*pi/180*cos(q),[q]); p=symfun(79*pi

我想在MATLAB中区分以下函数wrt: T(e(x(T),T)/p(T))

我的问题是我在数值上知道x的导数(我在一种odefun中)。 我想使用diff使我的代码可以推广到高阶导数,但是x的导数现在是常数。我还希望所有这些都是在一个匿名函数中,我可以进行微分,并相应地替换所需的时间和x的导数,这样我就不必为系统的每个状态编写多个函数

我的代码如下:

syms q x star;
qd=symfun(90*pi/180+30*pi/180*cos(q),[q]);
p=symfun(79*pi/180*exp(-1.25*q)+pi/180,[q]);
T=log(-(1+star)/star);
e=symfun(x-qd,[x,q]);
我想写一个函数,比如


@(t,y)(d^2⁄dt^2t(e(x(t),t)⁄p(t))+d⁄dtt(e(x(t),t)⁄p(t))+t(e(x(t),t)⁄p(t))

我不确定实现细节,但通常这是您可以采取的一种方法。它包括两个步骤

  • T(.)
    函数中,当您进行微分时,用
    exp(T)
    替换
    x
    ,这种方式
    exp(T)
    始终保持在那里,以便取高阶导数,同时外部函数将根据
    x
    进行微分。执行
    diff
    之后,您应该会收到一个表达式,其中包含
    exp(t)
    (未测试,希望如此)。此时,
    exp(t)
    x
    的时间导数。现在您只需要在
    t
    中计算这个表达式。执行此操作时,您需要将
    exp(t)
    替换为
    x
    的导数。我不知道是否可以做到这一点,如果不能做到,那么可能使用
    y
    而不是
    exp(t)
    来约束
    y=exp(t)
    就可以了,但您需要自己找出正确的实现方法
  • 这里您需要替换右侧
    t
    x
    的导数。如果您在特定点
    t
    没有该值,请按照我在注释中的建议执行。在多个点中预先计算,并在此步骤中进行插值
    这种方法依赖于将
    x(t)
    exp(t)
    交换,如果这不起作用,那么我会按照我在评论中的建议去做。用已知函数近似
    x(t)
    ,并在代码中使用该函数而不是
    x

    我不理解您的代码,尤其是我很难在其中找到上面的公式。然而,从描述中我推断,您的问题在于
    x
    的时间导数不是已知函数。因此,你可以做的一件事是计算许多
    x
    值的导数,然后用一个已知函数进行近似(本质上是插值)。如果你用一个低阶多项式近似导数,那么你也可以计算它的高阶导数,尽管你可能不需要它,因为你打算使用diff。如果你用“e(x(t),t)/(p(t)”替换变量“star”,那么这个公式就会出现。x实际上不是一个函数!我只知道给定时刻的x,x',x'',好了,现在我明白了,我想。起初我认为
    e
    是Euler数(即
    exp(.)
    ),而它是一个函数
    e(.)
    。我也没想到你也知道
    x
    的高阶导数。