Octave,寻找数值函数的最大值
Octave, finding the maximum of a numeric function
我正在尝试使用 Octave 计算具有两个 ODE 的系统解的最大值。我首先解决了系统本身:
function xdot = f (x,t)
a1=0.00875;
a2=0.075;
b1=7.5;
b2=2.5;
d1=0.0001;
d2=0.0001;
g=4*10^(-8);
K1=5000;
K2=2500;
n=2;
m=2;
xdot = zeros(2,1);
xdot(1) = a1+b1*x(1)^n/(K1^n+x(1)^n)-g*x(1)*x(2)-d1*x(1);
xdot(2) = a2+b2*x(1)^m/(K2^m+x(1)^m)-d2*x(2);
endfunction
t = linspace(0, 5000, 200)';
x0 = [1000; 1000];
x = lsode ("f", x0, t);
set term dumb;
plot(t,x);
但现在我不知道如何计算作为系统解获得的两个函数(数值函数)的最大值。我已经在互联网上搜索了,但我没有找到我想要的...我只找到函数 fminbnd 为一个区间上的函数的最小值...
是否可以使用 Octave 计算数值函数的最大值?
通常,如果您知道如何找到一个函数的最小值,您也就知道如何找到它的最大值:只需查找 -f 的最小值即可。
但是,fminbnd
是为可以在任何给定点计算的函数而设计的。你所拥有的只是一个 200 点的向量。原则上,您可以使用插值来获得一个函数,然后将其最大化。但这并不是真正需要的,因为无论如何你拥有的所有信息都在那个矩阵 x 中,所以只在那里取最大值是有意义的。像这样:
[x1m, i1] = max(x(:,1));
[x2m, i2] = max(x(:,2));
disp(sprintf('Maximum of x1 is %f attained at t = %f', x1m, t(i1)));
disp(sprintf('Maximum of x1 is %f attained at t = %f', x2m, t(i2)));
我正在尝试使用 Octave 计算具有两个 ODE 的系统解的最大值。我首先解决了系统本身:
function xdot = f (x,t)
a1=0.00875;
a2=0.075;
b1=7.5;
b2=2.5;
d1=0.0001;
d2=0.0001;
g=4*10^(-8);
K1=5000;
K2=2500;
n=2;
m=2;
xdot = zeros(2,1);
xdot(1) = a1+b1*x(1)^n/(K1^n+x(1)^n)-g*x(1)*x(2)-d1*x(1);
xdot(2) = a2+b2*x(1)^m/(K2^m+x(1)^m)-d2*x(2);
endfunction
t = linspace(0, 5000, 200)';
x0 = [1000; 1000];
x = lsode ("f", x0, t);
set term dumb;
plot(t,x);
但现在我不知道如何计算作为系统解获得的两个函数(数值函数)的最大值。我已经在互联网上搜索了,但我没有找到我想要的...我只找到函数 fminbnd 为一个区间上的函数的最小值...
是否可以使用 Octave 计算数值函数的最大值?
通常,如果您知道如何找到一个函数的最小值,您也就知道如何找到它的最大值:只需查找 -f 的最小值即可。
但是,fminbnd
是为可以在任何给定点计算的函数而设计的。你所拥有的只是一个 200 点的向量。原则上,您可以使用插值来获得一个函数,然后将其最大化。但这并不是真正需要的,因为无论如何你拥有的所有信息都在那个矩阵 x 中,所以只在那里取最大值是有意义的。像这样:
[x1m, i1] = max(x(:,1));
[x2m, i2] = max(x(:,2));
disp(sprintf('Maximum of x1 is %f attained at t = %f', x1m, t(i1)));
disp(sprintf('Maximum of x1 is %f attained at t = %f', x2m, t(i2)));