zoukankan      html  css  js  c++  java
  • 【MATLAB建模学习实录【二】】非线性规划函数模型板子

    可以通过判断正定矩阵的方式来求解多元函数的极值点问题

    下面以二元函数为例:

    代码模板如下:

     1 clc,clear
     2 syms x y
     3 f=x^3-y^3+3*x^2+3*y^2-9*x;
     4 df=jacobian(f);%求导
     5 d2f=jacobian(df);%二阶导雅阁比行列式
     6 [xx,yy]=solve(df);%求驻点
     7 xx=double(xx);yy=double(yy);%化为double数组形式,用来进行运算
     8 for i = 1:length(xx)%遍历每个驻点
     9     ff=subs(f,{x,y},{xx(i),yy(i)});%球对应函数值
    10     ff=double(ff);
    11     a=subs(d2f,{x,y},{xx(i),yy(i)});%求特征值,如果所有特征值大于0为正定矩阵,都小于0为负定阵
    12     b=eig(a);
    13     if(all(b>0)) 
    14         fprintf('(%f,%f)是极小值点,对应极小值为%f
    ',xx(i),yy(i),ff);
    15     elseif (all(b<0))
    16         fprintf('(%f,%f)是极大值点,对应极大值为%f
    ',xx(i),yy(i),ff);
    17     elseif (any(b>0)&any(b<0))
    18         fprintf('(%f,%f)不是极值点
    ',xx(i),yy(i));
    19     else
    20         fprintf('(%f,%f)无法判断',xx(i),yy(i));
    21     end
    22 end

     上述问题还可以通过fminunc函数来求

     但本蒟蒻对于fminunc函数的用法还不甚熟练,尤其是其中x0参数的选择,发现不同的x0对于结果有不同的影响  查阅资料也没有很明白 (先挖个坑)

     代码如下:

    1 clc,clear
    2 f=@ (x) x(1)^3-x(2)^3+3*x(1)^2+3*x(2)^2-9*x(1);%定义隐函数
    3 g=@(x) -f(x);%求极大值时可以通过取负求极小值再取回来
    4 x0=rand(2,1);
    5 x0
    6 [x1,fval1]=fminunc(f,x0)%fminunc函数用于求极小值
    7 [x2,fval2]=fminunc(g,x0);
    8 x2,fval2 = -fval2%极大值取负后需要取回来

     求函数零点的方法相对简易,这里给出求符号解的模板:

    1 clc,clear
    2 syms x y ;
    3 [x,y]=solve(x^2+y-6,y^2+x-6)

    可以根据需要修改函数与参数。

  • 相关阅读:
    网络流24题题解
    NOIP2018游记
    AGC016题解
    雅礼集训总结
    数学相关【真·NOIP】
    NOIP2018系列
    洛咕P4180 严格次小生成树
    矩阵乘法学习笔记
    一些比较神奇的思路
    点分治复习记
  • 原文地址:https://www.cnblogs.com/BeyondW/p/13508796.html
Copyright © 2011-2022 走看看