最大化MatLab中的函数(使用fsolve和导数)

t0ybt7op  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(158)

我想找出使函数A(p)最大化的向量p(即p(1),p(2),p(3),...)的值。
我正在使用MatLab来做这件事,我找到了fsolve,我认为它可以帮助我。因此,我创建了函数A

function A = myfun(p)

    R  = 0.1; 
    u1 = 500;
    u2 = 400;
    u3 = 300;

    A = ( (p(1)+p(2)+p(3)) * (1/u1+1/u2+1/u3)) * ...
        (1 + R*(p(1)^2+p(2)^2+p(3)^2) * (1/u1+1/u2+1/u3) );

然后我需要解一个方程系统,它将是:

diff(A,p(1))==0

diff(A,p(2))==0

diff(A,p(3))==0

其中得到的p向量将是我的问题的解决方案。
fsolve如何解这个方程组(p0=[1 1 1])?

4dc9hkyq

4dc9hkyq1#

以下是如何使用符号工具箱执行此操作的示例:

%// (there's probably a way to generalize this as well)
dAdp = cellstr(char(...
    [char(diff('C * (p1+p2+p3) * (1 + R*C*(p1^2+p2^2+p3^2))', 'p1')) ';'],...
    [char(diff('C * (p1+p2+p3) * (1 + R*C*(p1^2+p2^2+p3^2))', 'p2')) ';'],...
    [char(diff('C * (p1+p2+p3) * (1 + R*C*(p1^2+p2^2+p3^2))', 'p3')) ';']))

%// convert to proper vector equation
dAdp = regexprep(dAdp, 'p([0-9])', 'p\($1\)');

%// convert to function handle
F = str2func( strcat('@(p) [', dAdp{:}, ']') );

但我不建议这样做(它完全不可读,而且容易出现错误)。
您可以编写一个适当的函数并使用符号工具箱计算上面的dAdp,但我也不建议这样做(只是非常慢)。
我是一个喜欢计算的人,因为我只信任计算机的功能:计算。我在纸上做推导,除了非常简单,但冗长而乏味的推导(你可以争辩说,情况就是这样,我仍然*喜欢在纸上做,因为我也喜欢锻炼我的大脑:)。
我建议你这样做,和/或使用符号工具箱不断检查自己。我的意思是,你应该把它当作一种辅助工具,而不是作为主引擎。
所以,我们开始吧。这又是你的函数,这一次是以不同的形式,应用了稍微多一点的大脑:

function A = myfun(p)    
    R = 0.1; 
    u = [500; 400; 300];     
    C = sum(1./u);
    B = C * sum(p) * (1 + R*C*sum(p.^2));

所以,你想要解∇A(p)=0。最好的方法是运用更多的大脑。您可以验证向量导数是否等于:

function F = Aprime(p)
    R = 0.1;
    u = [500; 400; 300];
    C = sum(1./u);
    F = C*( C*R*sum(p.^2) + 2*C*R*p*sum(p) + 1 );

你可以用更多的大脑来解决这个问题:

C·( CR·Σp² + 2CR·p·Σp + 1 ) = 0
                Σp² + 2p·Σp = -1/(CR)

VECTOR==标量:这意味着p中的所有元素都相等。
代入q=p1=p2=p3,然后

3q² + 2q·3q = -1/(CR)
         9q² = -1/(CR)

⇒q=⅓·√(-1/(CR))
(表示有问题),或者在fsolve中如下所示:

fsolve(@Aprime, [1 1 1])

这将立即导致
解算完成,因为初始点处的函数值向量按函数公差的缺省值衡量接近于零,并且问题按梯度衡量看起来是规则的。
这确实意味着有麻烦了。
由于您已经表示您对最大值感兴趣,并且该函数似乎没有驻点,因此唯一的结论是该函数没有最大值也没有最小值,除非您在p上施加界限。事实上,如果你将维度降低到2,并制作一个曲线图:

R = 0.1;
u = [500; 400; 300];
C = sum(1./u);
B = @(p) C * sum(p) .* (1 + R*C*sum(p.^2));

[p1,p2] = meshgrid(-10:0.1:10);
surf(p1,p2,reshape(B([p1(:) p2(:)].'), size(p1)), 'edgecolor', 'none')

...没有极值。

相关问题