matlab用于自动区分

时间:2013-06-05 14:07:29

标签: matlab differentiation

如果你们中的某个人可以帮助我,或者指出我的方向是正确的,那将是非常好的。

我有以下公式,其中有8个参数因每个主题而异。该等式描述了t为时间且y为增长的增长模式。 m1m8是每个主题不同的参数

y = m1*(1-1/(1+(m2*(t+m8))^m5+(m3*(t+m8))^m6+(m4*(t+m8))^m7))

我想要做的是插入此公式并计算(数值)速度曲线。根据这些信息,我想获得以下

  • 当时的最大速度和相应的年龄和身高
  • 达到最大速度前的最小速度。

以这种方式,我只是列出我所有的主题和他们的参数,只是收到我的结果?

我在编程和数学方面没有任何背景,但我希望能够做到这一点。我有matlab供我使用。我试图弄清楚事情是如何运作的但是我无法控制住它。作为一名生物学家,我将在明年学习编程课程;-)

你们中的任何人都可以帮助我吗?

谢谢

更新但仍然没有(感谢你们: - ))

- 我已经制作了一个从excel派生的制表符分隔文件,并具有以下结构 列A:主题的ID Colum B to I:不同参数m1 ... m8的值(如公式中所示) 每行是具有不同参数的不同主题

  • 我选择了导入选择和下一个生成函数(或者我应该选择生成脚本)。

  • 如果我打开这个,我会看到一个新的编号标签出现。第一行是功能[ID,m1,...,m8] = importfile。然后按照112行。

  • 我已经从第113行开始复制dan给出的文本(感谢dan)。

    TMIN = 0; 的t max = 20; DT = 1/12; T =的TiMn:DT:t最大; y = m1。(1-1 ./(1+(m2。(t + m8))。^ m5 +(m3。(t + m8))。^ m6 +(m4。 (T + M8))^ M7)); DY = DIFF(Y)./ DT; 最大值(DY); 分钟(DY); IMAX =查找(DY == MAX(DY))+ 1; IMIN =找到(DY ==分钟(DY))+ 1; 吨(IMAX); 吨(IMIN); Y(IMAX); Y(IMIN);

    • 接下来我点击了运行并被要求保存我已经完成的文件。
    • 现在我点击了再次运行,但我收到了错误

任何可以指引我正确方向的人? 非常感谢

问候

3 个答案:

答案 0 :(得分:0)

如果你的方程是这样的形式:y = f(t,...,... ...)并且所有其他参数在每个主题的所有时间都保持不变,那么你就可以这样做。

首先确定一个时间范围(所以我要用10年,但这完全取决于你的工作):

tmin = 0;
tmax = 10;

然后你必须选择一个时间分辨率(我已经每月一次,但你可能想要更精细的东西):

dt = 1/12;

现在创建一个t向量并以数字方式求解y

t = timn:dt:tmax;
y = m1.*(1-1./(1+(m2.*(t+m8)).^m5+(m3.*(t+m8)).^m6+(m4.*(t+m8)).^m7));

一阶数值微分只是找到y的每两个连续点之间的斜率。 I.E. (y(i) - y(i - 1)) / (t(i) - t(i - 1))并注意t(i) - t(i - 1)始终等于dt。所以在matlab中我们可以这样做:

dy = diff(y)./dt;

但现在dy的元素少于dt。记住这一点。

所以要找到最大和最小速度:

max(dy);
min(dy);

并找到相应的时间和高度:

imax = find(dy==max(dy)) + 1;
imin = find(dy==min(dy)) + 1;

t(imax);
t(imin);
y(imax);
y(imin);

答案 1 :(得分:0)

因为你的问题有点普遍,我可以提供一些指示。

  • 您可以存储在[function][1][function handle][2]中的公式 - 还有一个可以使用的符号数学工具箱(在这种情况下,您可以使用符号区分来查找极值)

  • 接下来基本上是循环(参见forwhile) - 将依赖于您如何将数据读入matlab。

  • 最后会找到极值(我想你不知道它们的确切时间) - 查找fmin命令进行数值最小化(用于最小值 - 但对于最大值,只需使用{{ 1}}你的功能是客观的) - 如果有几个你可能需要玩它的设置。

  • 让我们不要忘记一些输出。我认为-最舒服。但帮助会指出你的选择。


作为旁注,您应该尝试手动区分以检查您应该期望的解决方案数量。

答案 2 :(得分:0)

首先,这是一个可复制的解决方案。我的答案的其余部分是解释:)

(你需要从FEX中FindRealRoots来运行它。)

trange = [tstart tend] % <your range in t>

% define all intermediate functions
a = m2^m5;
b = m3^m6;
c = m4^m7;
X = @(t) t(:).' + m8;

g   = @(t) 1 + [a b c] * bsxfun(@power, X(t), [m5; m6; m7]);
gp  = @(t) ([m5 m6 m7].*[a b c]) * bsxfun(@power, X(t), [m5-1; m6-1; m7-1]);
gpp = @(t) (([m5 m6 m7]-1).*[m5 m6 m7].*[a b c]) * ...
           bsxfun(@power, X(t), [m5-1; m6-1; m7-1]);
sgn = @(t) m1*(2*(gp(t)).^2 - g(t).^2*gpp(t) );

y   = @(t) m1*(1 + 1./g(t));   
yp  = @(t) -m1*gp(t) ./ g(t).^2;

% Find the roots of the derivative
R = FindRealRoots(gp, tstart , tend, 2*ceil(max([m5 m6 m7])));

% values at end-points
y0   = y(tstart);
yend = y(tend);

% if we have some roots, separate minima/maxima and sort
if ~isempty(R)

    extrema = y(R);
    signs   = sgn(R);

    % Find maximum
    [maximum, Imax] = max(extrema(signs < 0));
    tmax = R(Imax);

    if isempty(tmax) % no maximum in interval; use endpoint
        [~,ind] = max([y0, yend]);
        tmax = trange(ind);
    end

    ymax = y(tmax);


    % Find minimum *before* maximum
    [minima, Imin] = extrema(signs > 0); 
    tmin = R(Imin);

    if isempty(tmin) % no minimum on interval; use endpoint
        [~,ind] = min([y0, yend]);
        tmin = trange(ind);
    end

    if any(tmin < tmax)
        % make sure to take only one minimum; the one 
        % just before the maximum
        tmin = tmin(find(tmin < tmax, 1, 'last')); 
    else
        [~,ind] = min([y0, yend]);  % no minima before the maximum; use end-point
        tmin = trange(ind);
    end

    ymin = y(tmin);


else % no roots found; just order the end-points

    [ymax,ind] = max([y0, yend]); 
    tmax = trange(ind);

    [ymin,ind] = min([y0, yend]); 
    tmin = trange(ind);

end

现在,解释。

虽然Dan的回答是不错的第一步,但我觉得我必须在几个地方纠正它。

对于初学者来说,数值导数的计算方法是丹只在

时描述它们
  • 您有网格化数据(y(t)的值在多个不同的点t
  • 众所周知,基础模型函数y(t)不允许插值

在你的情况下,这根本不是真的。如果您有一个可以在任意点评估的显式函数,则最好使用finite differences计算数值导数,而在无法通过分析方法找到显式导数时,通常仅使用

例如,z = cos(x) x = π/4的数字导数(使用与h = 0.001的中心差异):

  z'(π/4) ≅ ( z(x+h)-z(x-h) ) / 2h                      
          = ( cos(π/4 + 0.001) - cos(π/4 - 0.001) ) / 0.002
          = -0.7071066633353995...
-sin(π/4) = -0.7071067811865475...   (value of analytical derivative)

话虽如此,我们继续谈到更重要的一点;在你不得不求助于数值方法之前,数学可以比丹更进一步进步。这样做可能会更加繁琐,但它会提高您对问题的理解,MATLAB,数学,并且它将提高结果的准确性和稳健性。

对于您的函数y = f(t),您声明您有3个目标:

  1. 查找速度曲线
  2. 查找最大值y(t max ) = y max
  3. 查找之前发生的最低y min t min >最大y max
  4. 翻译成数学术语时:

    1. 查找衍生产品y' = dy/dt
    2. (和3.)查找R的所有根y'并评估yy''R以及y在初始时间t 0
    3. 让我们从目标1开始。你有一个明确的时间函数y = f(t),它基本上是rational function的变体形式,

          y(t) = a + f(t)/g(t)  
      

      为简洁起见,让我们放弃(t)-part。写起来容易得多,并且了解yfg都取决于t。所以,

      y = a + f/g
      

      你的优势是f(t) = <constant> = a = m1,这有助于以后的工作。这种函数的derivative的表达式采用这种形式(quotient rule):

      y' = (f'·g - f·g') / g²
      

      并且,从f(t) = m1 = <constant>开始,其相对于时间的衍生物

      y' = -m1·g' / g²
      

      现在,我们需要找到g的衍生物。函数g是多项式

      g = 1 + (m2·(t+m8)) m5 + (m3·(t+m8)) m6 + (m4·(t+m8)) m7功能

      让我们定义X = t + m8a = m2 m5 b = m3 m6 c = m4 m7 。有了这个,g看起来就不那么可怕了:

      g = 1 + a·X m5 + b·X m6 + c·X m7功能

      多项式的区分遵循elementary power rule(和chain rule,但这里

      }

      }

      X' = 1 g' = m5·a·X m5-1 + m6·b·X m6-1 + m7·c·X功能

      因此,

      m7-1 y' = -m1·g' / g² = -m1 · (m5·a·X m5-1 + m6·b·X m6-1 + m7·c·X功能 m7-1 ) / (1 + a·X m5 + b·X m6 {{1} } + c·X

      目标1完成了!您现在可以完全准确地评估任何位置的速度曲线。以下是如何在MATLAB中实现此功能:

      m7

      现在客观2:

      1. 找到的所有roots
      2. 在这些根上评估a = m2^m5; b = m3^m6; c = m4^m7; X = @(t) t + m8; dydt = @(t) -m1*( [m5*a m6*b m7*c]*X(t).^[m5-1; m6-1; m7-1] ) ./ ... ( 1 + [a b c]*X(t).^[m5; m6; m7] ).^2;
      3. 在这些根上展开y' = 0
      4. 评估y - 间隔
      5. 的终点y''

        步骤3.有必要确定y的根t是否描述{{1>}的最大最低 。在R的情况下,您正在处理最大,如果y' = 0最小,并且您正在处理y一个拐点,你可以放心地忽略这个问题。

        步骤4.是必要的,因为可能存在这样的情况:在最大值之前,函数中没有最小值,直到超出终点。在这种情况下,终点本身是您应该使用的最小值。

        现在,步骤1.如果你看一下这个等式的一般形状,

        y''(R) < 0

        显然,这只有在y'' > 0时才有可能。因此,我们必须解决

        y''(R) = 0

        y' = -m1·g' / g² = 0 g' = 0 g' = 0 => m5·a·X m5-1 + m6·b·X功能 m6-1

        现在只有 ,我们才会陷入数学进步的困境。这个等式有一个简单的解决方案(+ m7·c·Xm7-1))。但是,对于参数= 0的特定值,只有通用解决方案。对于这些参数的所有其他值,不存在通用解决方案,您必须以数字方式查找解决方案。

        因此,我建议您使用

        对于第3步,您将重复再次使用衍生物的过程;

        t = -m8

        其中

        m5-7 m5-7 y' = -m1·g' / g² => y'' = m1·( 2·(g')² - g²·g'' ) / (g²)² g'' = (m5-1)·m5·a·X m5-2 + (m6-1)·m6·b·X 。请注意,您只需要符号,所以只有分子就足够了),

        m6-2

        以下是在MATLAB中如何做到这一点:

        + (m7-1)·m7·c·X

        然后,使用之前找到的所有根m7-2,您只需评估所有内容:

        sgn(y'') = sgn( m1·( 2·(g')² - g²·g'' ) )
        

        现在你拥有所有的根,所有的g = @(t) 1 + [a b c]*X(t).^[m5; m6; m7]; gp = @(t) ([m5 m6 m7].*[a b c]) * X(t).^[m5-1; m6-1; m7-1]; gpp = @(t) (([m5 m6 m7]-1).*[m5 m6 m7].*[a b c]) * X(t).^[m5-1; m6-1; m7-1]; sgn = @(t) m1*(2*(gp(t)).^2 - g(t).^2*gpp(t) ); 值都在根和终点,以及所有二阶导数的符号......

        目标2完成了!