0

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

上面的函数显示了两个“世代”之间的差异。

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

谢了,兄弟们。

4

1 回答 1

0

好的,我已经解决了。

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

给定某些等位基因,参数“wAA”、“wAa”和“waa”将被视为常数并且不会改变。(他们定义了健身- 一个生物学/进化术语)。

所以输入只是计算适应度的世代跨度。

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') 

希望这有帮助:)

于 2013-03-10T03:22:37.430 回答