梯度投影法matlab源码程序 - matlab算法设计 - 谷速源码
下载频道> 资源分类> matlab源码> 算法设计> 梯度投影法matlab源码程序

标题:梯度投影法matlab源码程序
分享到:

所属分类: 算法设计 资源类型:程序源码 文件大小: 65.62 KB 上传时间: 2019-06-17 22:52:40 下载次数: 56 资源积分:1分 提 供 者: zhangsan456 code
内容:
梯度投影法matlab源码程序
function [x,minf] = minRosen(f,A,b,x0,var,eps)
format long;
if nargin == 5
    eps = 1.0e-6;
end
 
syms l;
x0 = transpose(x0);
n = length(var);
sz = size(A);
m = sz(1);
 
gf = jacobian(f,var);
bConti = 1;
 
while bConti
    k = 0;
    s = 0;
    A1 = A;
    A2 = A;
    b1 = b;
    b2 = b;
    for i=1:m
        dfun = A(i,:)*x0 - b(i);
        if abs(dfun)<0.000000001
            k = k + 1;
            A1(k,:) = A(i,:);
            b1(k,1) = b(i);
        else
            s = s+1;
            A2(s,:) = A(i,:);
            b2(s,1) = b(i);
        end
    end
    if k > 0
        A1 = A1(1:k,:);
        b1 = b1(1:k,:);
    end
    if s > 0
        A2 = A2(1:s,:);
        b2 = b2(1:s,:);
    end
    
    while 1
        P = eye(n,n);
        if k > 0
            tM = transpose(A1);
            P = P - tM*inv(A1*tM)*A1;
        end
        gv = Funval(gf, var, x0);
        gv = transpose(gv);
        d = -P*gv;
        if d == 0
            if k == 0
                x = x0;
                bConti = 0;
                break;
            else
                w = inv(A1*tM)*A1*gv;
                if w>=0
                    x = x0;
                    bConti = 0;
                    break;
                else
                    [u,index] = min(w);
                    sA1 = size(A1);
                    if sA1(1) == 1
                        k = 0;
                    else
                        k = sA1(2);
                        A1 =[ A1(1:(index-1),:); A1((index+1):sA1(2),:)];
                    end
                end
            end
        else
            break;
        end
    end
 
    yl = x0 + l*d;
    tmpf = Funval(f,var,yl);
    bb = b2 - A2*x0;
    dd = A2*d;
    if dd >= 0
        [tmpI,lm] = minJT(tmpf,0,0.1);
    else
        lm = inf;
        for i=1:length(dd)
            if dd(i) < 0
                if bb(i)/dd(i) < lm
                    lm = bb(i)/dd(i);
                end
            end
        end
    end
    [xm,minf] = minHJ(tmpf,0,lm,1.0e-14);
    tol = norm(xm*d);
    if tol < eps 
        x = x0;
        break;
    end
    x0 = x0 + xm*d;  
end
        
minf = Funval(f,var,x);

文件列表(点击上边下载按钮,如果是垃圾文件请在下面评价差评或者投诉):

minRosen.m
tb.docx

关键词: 梯度投影法 matlab源码程序

Top_arrow
回到顶部
联系方式| 版权声明| 招聘信息| 广告服务| 银行汇款| 法律顾问| 兼职技术| 付款方式| 关于我们|
网站客服网站客服 程序员兼职招聘 程序员兼职招聘
沪ICP备19040327号-3
公安备案号:沪公网安备 31011802003874号
库纳格流体控制系统(上海)有限公司 版权所有
Copyright © 1999-2014, GUSUCODE.COM, All Rights Reserved