代码之家  ›  专栏  ›  技术社区  ›  Guy Wald

Matlab:在连续输入跨度上使用Ode23

  •  0
  • Guy Wald  · 技术社区  · 12 年前

    我正试图弄清楚如何使用ode23进行此操作。 我有一个功能:

    function res = HardyWeinberg(inAFrequency, inFitness_AA, inFitness_Aa, inFitness_aa)
        fA = inAFrequency;
        wAA = inFitness_AA;
        wAa = inFitness_Aa;
        waa = inFitness_aa;
        res = (fA*(1-fA)*(fA*(wAa - wAA) + (1-fA)*(waa - wAa)))/(fA*fA*wAA + 2*fA*(1-fA)*wAa     + (1-fA)*(1-fA)*waa);
    end
    

    我想在[0 10]的连续跨度上运行它。 我看到的每个例子都包括函数中的一个变更合并参数。在我的情况下,下一次计算的inA频率是上一次计算结果。 也许我在这里遗漏了一些东西(在数学或Matlab方面)。

    上述函数显示了以下两个“代”之间的差异。

    请告知如何计算跨度上的ode23。

    谢谢 男人

    1 回复  |  直到 12 年前
        1
  •  0
  •   Guy Wald    12 年前

    好的,我已经解决了。

    一点背景: Hardy–Weinberg principle 基本上是一种计算遗传特性频率变化的方法。 例如,定义我们眼睛颜色的基因有多个等位基因(棕色等位基因、蓝色等位基因和绿色等位基因)。我们的眼睛颜色基因是由两个等位基因构建的,一个来自我们的父系,另一个来自母系,它们都决定了我们的眼睛的颜色。适合度是衡量我们繁殖和后代“成功”的标准,这受到我们基因的影响。 Hardy-Weinberg原理有助于根据一个等位基因在人群中的初始频率及其与其他等位基因的遗传贡献的适合性来计算该等位基因随时间的频率。好的和有贡献的等位基因可能有助于某种生物更多地繁殖,因此从统计数据来看,该等位基因越来越多地传播,直到它可能在种群中固定下来(或者,如果它不好或没有贡献,它可能会消失)。无论如何。。。

    给定某些等位基因,参数“wAA”、“wAA”和“wAA”应被视为常数,不会改变。(它们定义了 Fitness -生物学/进化术语)。

    因此,输入只是计算适应度的几代人的跨度。

    Hardy-Weinberg函数是:

    function res = HardyWeinberg(t, x)
        fA = x; %# Frequency
        wAA = 1; wAa = 1.01; waa = 1.01; %# Fitness values
        res = (fA*(1-fA)*(fA*(wAa - wAA) + (1-fA)*(waa - wAa)))/(fA*fA*wAA + 2*fA*(1-fA)*wAa + (1-fA)*(1-fA)*waa);
    end
    

    在初始等位基因频率为0.5的世代范围内计算ode23:

    [tv f1] = ode23(@HardyWeinberg,[1 analytical.Generations],[analytical.A_Frequency]);
    plot(tv,f1,tv,1-f1);
    xlabel('Generation');
    ylabel('Frequency') 
    

    希望这能有所帮助:)