[已答复] MATLAB 最优化问题—牛顿法

[复制链接]
啵啵薄荷 发表于 2022-5-7 22:11:59
本帖最后由 啵啵薄荷 于 2022-5-7 22:13 编辑

想请教一下各位大佬,我在用 MATLAB R2016a 中运行下面代码的时候,会有报错信息,不知道代码是哪里有问题,还是有其它的什么问题。请各位大佬指点一二,非常感谢!!(代码和报错信息都已经附上)

这是代码部分:
function [x,val,k] = dampnm(fun,gfun,Hess,x0)
%功能: 用阻尼牛顿法求解无约束问题: min f(x)
%输入: x0是初始点, fun, gfun, Hess分别是求
% 目标函数值,梯度,Hesse 阵的函数
%输出: x, val分别是近似最优点和最优值, k是迭代次数.
maxk=100; %给出最大迭代次数
rho=0.55;sigma=0.4;
k=0; epsilon=0.001;
while(k<maxk)
    gk=feval(gfun,x0); %计算梯度
    Gk=feval(Hess,x0); %计算Hesse阵
    dk=-Gk\gk; %解方程组Gk*dk=-gk, 计算搜索方向
    if(norm(gk)<epsilon), break; end %检验终止准则
    m=0; mk=0;
    while(m<20) % 用Armijo搜索求步长
        if(feval(fun,x0+rho^m*dk)<feval(fun,x0)+sigma*rho^m*gk'*dk)
            mk=m; break;
        end
        m=m+1;
    end
    x0=x0+rho^mk*dk;
    k=k+1;
end
x=x0;
val=feval(fun,x);
function He = Hess(x)

n = length(x);
He = zeros(n,n);
He=[2, 0;
        0, 4];

x0 = [-2 2]';
[x, val, k] = dampnm('fun', 'gfun', 'Hess', x0)

这是报错部分:
错误使用 feval
未定义与 'double' 类型的输入参数相对应的函数 'gfun'。

出错 dampnm (line 10)

gk=feval(gfun,x0); %计算梯度


3 条回复


20141303 发表于 2022-5-8 09:17:05
仅供参考,调用dampnm时,没有输入fun,gfun等函数是什么呀,类似这样
  1. x0 = [-2 2]';
  2. fun = @(x)x+1;
  3. gfun = @(x) x.^2+1;
  4. [x, val, k] = dampnm(fun, gfun, @(x)Hess(x), x0)
  5. function [x,val,k] = dampnm(fun,gfun,Hess,x0)
  6. %功能: 用阻尼牛顿法求解无约束问题: min f(x)
  7. %输入: x0是初始点, fun, gfun, Hess分别是求
  8. % 目标函数值,梯度,Hesse 阵的函数
  9. %输出: x, val分别是近似最优点和最优值, k是迭代次数.
  10. maxk=100; %给出最大迭代次数
  11. rho=0.55;sigma=0.4;
  12. k=0; epsilon=0.001;
  13. while(k<maxk)
  14.     gk=feval(gfun,x0); %计算梯度
  15.     Gk=feval(Hess,x0); %计算Hesse阵
  16.     dk=-Gk\gk; %解方程组Gk*dk=-gk, 计算搜索方向
  17.     if(norm(gk)<epsilon), break; end %检验终止准则
  18.     m=0; mk=0;
  19.     while(m<20) % 用Armijo搜索求步长
  20.         if(feval(fun,x0+rho^m*dk)<feval(fun,x0)+sigma*rho^m*gk'*dk)
  21.             mk=m; break;
  22.         end
  23.         m=m+1;
  24.     end
  25.     x0=x0+rho^mk*dk;
  26.     k=k+1;
  27. end
  28. x=x0;
  29. val=feval(fun,x);
  30. end
  31. function He = Hess(x)
  32. n = length(x);
  33. He = zeros(n,n);
  34. He=[2, 0;
  35.         0, 4];
  36. end
复制代码

啵啵薄荷 发表于 2022-5-15 18:55:40
20141303 发表于 2022-5-8 09:17
仅供参考,调用dampnm时,没有输入fun,gfun等函数是什么呀,类似这样

还是报错
未定义函数或变量 'Hess'。
出错 @(x)Hess(x)
出错 dampnm (line 11)
    Gk=feval(Hess,x0); %计算Hesse阵

20141303 发表于 2022-5-16 08:41:46
仅供参考,程序可以运行
1.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表