查看: 282|回复: 0|关注: 0

[未答复] 错误使用e04wc,输出参数太多

[复制链接]

新手

5 麦片

财富积分


050


2

主题

4

帖子

0

最佳答案
发表于 2020-1-15 11:05:40 | 显示全部楼层 |阅读模式
本帖最后由 为什么_Mp1bR 于 2020-1-16 09:55 编辑

如下为NAG library里面e04wc的程序,是别人文章里给的,用来求某函数最小值的,但是我运行时会说错误使用e04wc,输出参数太多,球球大佬怎么搞?


function e04wc_example

fprintf('e04wc example results\n\n');
a  = [1, 1, 1, 1];
bl = [1, 1, 1, 1, -1e25, -1e25,   25];
bu = [5, 5, 5, 5,    20,    40, 1e25];
istate = zeros(7, 1, 'int64');
ccon   = zeros(2,1);
cjac   = zeros(2,4);
clamda = zeros(7,1);
hess   = zeros(4,4);
x      = [1; 5; 5; 1];
[iw,rw,ifail]=e04wc;
[majits, istate, ccon, cjac, clamda, objf, grad, hess, x, ...
                                          iw, rw, user, ifail] = ...
  e04wd(...
        a, bl, bu, @confun, @objfun, istate, ccon, cjac, clamda, ...
        hess, x, iw, rw);
fprintf('Final objective value    :   %8.1f\n',objf);
fprintf('Optimal values for x     :  ');
fprintf(' %9.2f',x);
fprintf('\nGradients at x           :  ');
fprintf(' %9.2f',grad);
fprintf('\nConstraint functions at x:  ');
fprintf(' %9.2f',ccon);
fprintf('\nNumber of major iterations  = %5d\n',majits);

function [mode, ccon, cjac, user] = ...
    confun(mode, ncnln, n, ldcj, needc, x, cjac, nstate, user)
  ccon = zeros(ncnln, 1);
  if (nstate == 1)
%  first call to confun.  set all jacobian elements to zero.
%  note that this will only work when 'derivative level = 3'
%  (the default; see section 11.2).
    cjac = zeros(ncnln, n);
  end
  if (needc(1) > 0)
    if (mode == 0  ||  mode == 2)
      ccon(1) = x(1)^2 + x(2)^2 + x(3)^2 + x(4)^2;
    end
    if (mode == 1  ||  mode == 2)
      cjac(1,1) = 2*x(1);
      cjac(1,2) = 2*x(2);
      cjac(1,3) = 2*x(3);
      cjac(1,4) = 2*x(4);
    end
  end
  if (needc(2) > 0)
    if (mode == 0  ||  mode == 2)
      ccon(2) = x(1)*x(2)*x(3)*x(4);
    end
    if (mode == 1  ||  mode == 2)
      cjac(2,1) = x(2)*x(3)*x(4);
      cjac(2,2) = x(1)*x(3)*x(4);
      cjac(2,3) = x(1)*x(2)*x(4);
      cjac(2,4) = x(1)*x(2)*x(3);
    end
  end

function [mode, objf, grad, user] = objfun(mode, n, x, grad, nstate, user)
  if (mode == 0 || mode == 2)
    objf = x(1)*x(4)*(x(1)+x(2)+x(3)) + x(3);
  end
  if (mode == 1 || mode == 2)
    grad(1) = x(4)*(2*x(1)+x(2)+x(3));
    grad(2) = x(1)*x(4);
    grad(3) = x(1)*x(4) + 1;
    grad(4) = x(1)*(x(1)+x(2)+x(3));
  end
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表