Matlab:在连续输入范围内使用Ode23

时间:2013-03-10 02:33:44

标签: matlab integration solver

我正在试图弄清楚如何使用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]的连续跨度上运行它。 我见过的每个例子都包含了函数中变化incorperation的参数。在我的情况下,下一次计算的inAFrequency是先前计算的结果。 也许我在这里遗漏了一些东西(数学或Matlab明智)。

上述功能显示了两个“后代”之间的差异。

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

谢谢, 盖

1 个答案:

答案 0 :(得分:0)

好的,我已经解决了。

一些背景知识: 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

计算一代代的ode23,初始等位基因频率为0.5:

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

希望这有助于:)