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

问题描述 投票:0回答:1

我正在尝试弄清楚如何使用 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] 的连续范围内运行它。 我见过的每个例子都在函数中包含了一个变化合并的参数。就我而言,下一次计算的 inAFrequency 是上一次计算的结果。 也许我在这里遗漏了一些东西(数学或 Matlab 方面)。

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

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

谢谢, 盖伊。

matlab solver numerical-integration
1个回答
0
投票

好的,我已经解决了。

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

给定某些等位基因,参数“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') 

希望这有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.