如果你们中的某个人可以帮助我,或者指出我的方向是正确的,那将是非常好的。
我有以下公式,其中有8个参数因每个主题而异。该等式描述了t
为时间且y
为增长的增长模式。 m1
到m8
是每个主题不同的参数
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);
任何可以指引我正确方向的人? 非常感谢
问候
答案 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]
中的公式 - 还有一个可以使用的符号数学工具箱(在这种情况下,您可以使用符号区分来查找极值)
接下来基本上是循环(参见for
或while
) - 将依赖于您如何将数据读入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个目标:
y(t
max
) = y
max
y
min
,t
min
>最大y
max
翻译成数学术语时:
y' = dy/dt
R
的所有根y'
并评估y
和y''
,R
以及y
在初始时间t
0
。 让我们从目标1开始。你有一个明确的时间函数y = f(t)
,它基本上是rational function的变体形式,
y(t) = a + f(t)/g(t)
为简洁起见,让我们放弃(t)-part。写起来容易得多,并且了解y
,f
和g
都取决于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 + m8
,a = 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:
)²
的所有roots。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;
y' = 0
y
- 间隔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·X
(m7-1
))。但是,对于参数= 0
的特定值,只有通用解决方案。对于这些参数的所有其他值,不存在通用解决方案,您必须以数字方式查找解决方案。
因此,我建议您使用
X = 0
为整数时,roots
FindRealRoots
当他们不是对于第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完成了!