对于给定的一组q
和r
,我想找到(0,1)和Tp=x * log(1 + (q* r (1 - 1/y)* (2/x - y))/(1 + r* (1 - 1/y) + q* (2/x - y)))
中x
的{{1}}的最大值在(1,2)中。
我可以使用两个y
循环来计算它们,但是当我使用for
和x
的非常小的步长时,例如0.00001,这需要很长时间。但我知道,如果我将y
作为所有Tp
和x
的矩阵,即y
是大小为Tp
的矩阵,则可能更容易快点。在我阅读时,length(x) x length(y)
可能会有所帮助,但我不知道如何在我的问题中应用它。
这是我尝试过的,但它没有给出正确的输出。在这里,我使用更大的步长来理解。有人可以在我的代码中修复此问题吗?
bsxfun(@times,..)
答案 0 :(得分:1)
在for
循环中尝试此操作:
Tp = bsxfun(@(x,y) log(1+(q(k)*r(k)*(1 - 1./y).*(2./x - y))./(1 + r(k)*(1 - 1./y) + q(k)*(2./x - y)))*x,x,y.'); %\\'
MaxTp(k,1)=max(max(Tp));
[p2, q2] = ind2sub(size(Tp),find(Tp==MaxTp(k,1)));
ox(k,1)=x0+(p2-1)*stepx;
oy(k,1)=y0+(q2-1)*stepy;
我更改了bsxfun
以在功能部分而不是矢量输入中进行计算,并且您还覆盖p
和q
作为ind2sub
的结果
您也可以使用fmincon
(请注意最大化意味着我们需要最小化函数的负面影响)。以下代码进入for
循环:
f=@(x,y) log(1+(q(k)*r(k)*(1 - 1./y).*(2./x - y))./...
(1 + r(k)*(1 - 1./y) + q(k)*(2./x - y)))*x;
o(:,k)=fmincon(@(x) -f(x(1),x(2)),[0.5;0.5],[],[],[],[],[0;1],[1;2]);
o(:,k)
给出了最大的x
和y
坐标,但我认为它与您的ox
和oy
变量不同。