24小时热门版块排行榜    

查看: 1859  |  回复: 8

makechange74

铁虫 (小有名气)

[求助] 用Gauss-Neuton算法解非线形最小二乘法问题 已有1人参与

自己根据网上下载源代码修改的高斯-牛顿迭代法求非线形最小二乘问题,老是显示输入参数不足。注释是根据自己理解填写的
m文件代码如下:
function [x,minf] = GN(f,x0,var,eps)
format long;
if nargin == 3                %如果没有设置eps,则eps=1.0e-6
    eps = 1.0e-6;
end
S = transpose(f)*f;            %trnspose是转置,求得r方
k = length(f);                     %
n = length(x0);                 %n为变量个数,但是没用到啊?
x0 = transpose(x0);           %将行向量转置为列向量
tol = 1;                              %初始容差
A = jacobian(f,var);         

while tol>eps
    Fx = zeros(k,1);
    for i=1:k
        Fx(i,1) = subs(f(i),var,x0);
    end
    Sx = subs(S,var,x0);    %求得f转置与其本身值,
    Ax = subs(A,var,x0);    %雅克比矩阵的值
    gSx = transpose(Ax)*Fx;   

    dx = -transpose(Ax)*Ax\gSx;
    x0 = x0 + dx;
    tol = norm(dx);           %tol=dx绝对值之和
end
minf = subs(S,var,x);
format short;
x = x0;
end
命令窗口调用如下:
xdata = S1o;                     %S1o及下面的ydata1都是自己的数据
syms z1 z2 z3 z4 z5
f = ydata1 - exp(z1)./(exp(z1)+exp(-z1)).*exp(-(xdata./exp(z3)).^exp(z2))+(1-exp(z1)./(exp(z1)+exp(-z1))).*exp(-(xdata./exp(z5)).^exp(z4));
x0 = [1.7380;0.9555;-1.3863;2.0149;-2.5257];
var = findsym(f);
eps = 1.0e-3;
>> GN
提示错误如下:
错误使用 GN (line 6)
输入参数的数目不足。
回复此楼

» 收录本帖的淘帖专辑推荐

source

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yongcailiu

金虫 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★
感谢参与,应助指数 +1
makechange74: 金币+5, ★★★很有帮助 2015-01-23 19:13:55
参数没有加进去呀,当然调用错误了。eps=1.0e-3;下面一行的GN替换成GN(f,x0,var,eps)试一下
2楼2015-01-23 08:56:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

makechange74

铁虫 (小有名气)

引用回帖:
2楼: Originally posted by yongcailiu at 2015-01-23 08:56:32
参数没有加进去呀,当然调用错误了。eps=1.0e-3;下面一行的GN替换成GN(f,x0,var,eps)试一下

function [x,minf] = GN(f,x0,var,eps)
format long;
if nargin == 3                %如果没有设置eps,则eps=1.0e-6
    eps = 1.0e-6;
end
m = 0;
S = transpose(f)*f;           %trnspose是转置,求得r方
k = length(f);                %
%n = length(x0);               %n为变量个数,但是没用到啊?
x0 = transpose(x0);           %将行向量转置为列向量
tol = 1;                      %初始容差
A = jacobian(f,var);         

while tol>eps
    Fx = zeros(k,1);
    for i=1:k
        Fx(i,1) = subs(f(i),var,x0);
    end
    Sx = subs(S,var,x0);    %求得f转置与其本身值,
    Ax = subs(A,var,x0);    %雅克比矩阵的值
    gSx = transpose(Ax)*Fx;   

    dx = -transpose(Ax)*Ax\gSx;
    x0 = x0 + dx;
    tol = norm(dx);           %tol=dx绝对值之和
    m = m+1;
    if(m>100000)
        disp('迭代步数太多,可能不收敛');
        return;
    end
end
minf = subs(S,var,x);
format short;
x = x0;
end  


xdata = S1o;
f = ydata1 - exp(z1)./(exp(z1)+exp(-z1)).*exp(-(xdata./exp(z3)).^exp(z2))+(1-exp(z1)./(exp(z1)+exp(-z1))).*exp(-(xdata./exp(z5)).^exp(z4));
x0 = [1.7380;0.9555;-1.3863;2.0149;-2.5257];
var = findsym(f);
eps = 1.0e-3;
GN(f,x0,var,eps)
从 sym 转换为 double 时出现以下错误:


出错 GN (line 17)
        Fx(i,1) = subs(f(i),var,x0);

又出新问题了,还是麻烦能够解答一下
以下是数据
S1o:0.0580000000000000
0.0710000000000000
0.0760000000000000
0.0790000000000000
0.0830000000000000
0.0870000000000000
0.0980000000000000
0.111000000000000
0.117000000000000
0.122000000000000
0.122000000000000
0.133000000000000
0.134000000000000
0.138000000000000
0.140000000000000
0.142000000000000
0.150000000000000
0.155000000000000
0.160000000000000
0.160000000000000
0.168000000000000
0.173000000000000
0.173000000000000
0.173000000000000
0.175000000000000
0.176000000000000
0.177000000000000
0.181000000000000
0.182000000000000
0.183000000000000
0.194000000000000
0.203000000000000
0.214000000000000
0.218000000000000
0.222100000000000
0.223000000000000
0.225000000000000
0.247000000000000
0.253000000000000
0.256000000000000
0.257000000000000
0.258000000000000
0.262000000000000
0.263000000000000
0.264000000000000
0.266000000000000
0.267000000000000
0.276000000000000
0.278000000000000
0.280000000000000
0.288000000000000
0.289000000000000
0.306000000000000
0.315000000000000
0.333000000000000
0.335000000000000
0.353000000000000
0.389000000000000
0.404000000000000
0.418000000000000
0.456000000000000
0.489000000000000
ydata1:
0.983870967741936
0.967741935483871
0.951612903225807
0.935483870967742
0.919354838709677
0.903225806451613
0.887096774193548
0.870967741935484
0.854838709677419
0.838709677419355
0.822580645161290
0.806451612903226
0.790322580645161
0.774193548387097
0.758064516129032
0.741935483870968
0.725806451612903
0.709677419354839
0.693548387096774
0.677419354838710
0.661290322580645
0.645161290322581
0.629032258064516
0.612903225806452
0.596774193548387
0.580645161290322
0.564516129032258
0.548387096774193
0.532258064516129
0.516129032258064
0.500000000000000
0.483870967741935
0.467741935483871
0.451612903225806
0.435483870967742
0.419354838709677
0.403225806451613
0.387096774193548
0.370967741935484
0.354838709677419
0.338709677419355
0.322580645161290
0.306451612903226
0.290322580645161
0.274193548387097
0.258064516129032
0.241935483870968
0.225806451612903
0.209677419354839
0.193548387096774
0.177419354838710
0.161290322580645
0.145161290322581
0.129032258064516
0.112903225806452
0.0967741935483870
0.0806451612903230
0.0645161290322580
0.0483870967741930
0.0322580645161290
0.0161290322580639
0
3楼2015-01-23 19:12:03
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yongcailiu

金虫 (小有名气)

z1-z5是符号?如果如此的话,我没有见过Gauss-Newton法使用在这种场合下的。
4楼2015-01-24 11:14:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

makechange74

铁虫 (小有名气)

引用回帖:
4楼: Originally posted by yongcailiu at 2015-01-24 11:14:35
z1-z5是符号?如果如此的话,我没有见过Gauss-Newton法使用在这种场合下的。

Gauss-Newton法可以用求解最小非线形二乘法,在文献上看到的,此外为了改进Gauss-Newton算法,又提出了LM算法。
z1-z5是变量,也就是这个非线形最小二乘法要求解的值
5楼2015-01-25 09:45:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yongcailiu

金虫 (小有名气)

引用回帖:
5楼: Originally posted by makechange74 at 2015-01-25 09:45:11
Gauss-Newton法可以用求解最小非线形二乘法,在文献上看到的,此外为了改进Gauss-Newton算法,又提出了LM算法。
z1-z5是变量,也就是这个非线形最小二乘法要求解的值...

明白你要解决的问题了。就程序而言,x0代表z1-z5的初始值,不过matlab的程序实现过程好像有问题,可以将f=...;x0=...;这两行代码颠倒下次序,再讲f里面的z1-z5替换成x0(1)-x0(5)。另外,就像你说的,Gauss-Newton法可以用求解最小非线形二乘法,但是它要给出的目标函数是最小二乘误差,不是你程序中给出的这样,而是f = (ydata1 - yfitdata).^2。
6楼2015-01-25 11:48:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

makechange74

铁虫 (小有名气)

引用回帖:
6楼: Originally posted by yongcailiu at 2015-01-25 11:48:41
明白你要解决的问题了。就程序而言,x0代表z1-z5的初始值,不过matlab的程序实现过程好像有问题,可以将f=...;x0=...;这两行代码颠倒下次序,再讲f里面的z1-z5替换成x0(1)-x0(5)。另外,就像你说的,Gauss-Newton法 ...

一直在关注帖子,可就是没看到回复,真是囧。。
按照你的建议试了试,如果在命令窗口中输入syms x0(1) 则会提醒错误使用syms,如果只定义syms x0,令yfitdata=exp(x0(1))./(exp(x0(1))+exp(-x0(1))).*exp(-(xdata./exp(x0(3))).^exp(x0(2)))+(1-exp(x0(1))./(exp(x0(1))+exp(-x0(1)))).*exp(-(xdata./exp(x0(5))).^exp(x0(4)));也会提醒错误,
在输入命令时,应该是不允许()作为变量;但是如果将yfitdata(我函数名称写的是R)作为一个函数写在m文件中,
function F = R(x0,xdata)
F = exp(x0(1))./(exp(x0(1))+exp(-x0(1))).*exp(-(xdata./exp(x0(3))).^exp(x0(2)))+(1-exp(x0(1))./(exp(x0(1))+exp(-x0(1)))).*exp(-(xdata./exp(x0(5))).^exp(x0(4)));

调用如下:
syms x0
>>  x0 = [1.7380;0.9555;-1.3863;2.0149;-2.5257];
>> xdata = S1o;
>> f = 0.5.*(ydata1 - R(x0,xdata)).^2;
错误使用 sym>checkindex (line 1545)
Index must be a positive integer or logical.

出错 sym>privformatmatrix (line 1503)
    checkindex(x);

出错 sym>privformat (line 1478)
    s = privformatmatrix(x);

出错 sym/subsref (line 685)
            [inds{k},refs{k}] = privformat(inds{k});
真是不知道该怎么办了?

此外,按照最原本程序,错误提醒的是从 sym 转换为 double 时出现以下错误:
是不是跟sym定义的类型有关,这个问题还不是很明白,网络找的资源只有源程序,没有对应例子,对于新手还是有些困难
7楼2015-01-27 08:57:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yongcailiu

金虫 (小有名气)

引用回帖:
7楼: Originally posted by makechange74 at 2015-01-27 08:57:52
一直在关注帖子,可就是没看到回复,真是囧。。
按照你的建议试了试,如果在命令窗口中输入syms x0(1) 则会提醒错误使用syms,如果只定义syms x0,令yfitdata=exp(x0(1))./(exp(x0(1))+exp(-x0(1))).*exp(-(xdata ...

syms x0
>>  x0 = [1.7380;0.9555;-1.3863;2.0149;-2.5257];
>> xdata = S1o;
>> f = 0.5.*(ydata1 - R(x0,xdata)).^2;
符号运算这块儿我也不熟,你把上面这段代码中的 sym x0; 这一行去掉试下吧
8楼2015-01-27 09:46:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

makechange74

铁虫 (小有名气)

引用回帖:
8楼: Originally posted by yongcailiu at 2015-01-27 09:46:23
syms x0
>>  x0 = ;
>> xdata = S1o;
>> f = 0.5.*(ydata1 - R(x0,xdata)).^2;
符号运算这块儿我也不熟,你把上面这段代码中的 sym x0; 这一行去掉试下吧...

去掉这一行的话,后面var = findsym(f),就没法传递变量了,非常感谢你的回答,自己再去学习一下符号运算
9楼2015-01-27 14:57:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 makechange74 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 一志愿吉林大学材料学硕321求调剂 +9 Ymlll 2026-03-18 12/600 2026-03-20 00:01 by 23Postgrad
[考研] 生物学调剂招人!!! +3 山海天岚 2026-03-17 4/200 2026-03-19 21:34 by 怎么释怀
[考研] 0703化学调剂 ,六级已过,有科研经历 +12 曦熙兮 2026-03-15 12/600 2026-03-19 19:42 by maocaozhuxi
[考研] 271材料工程求调剂 +6 .6lL 2026-03-18 6/300 2026-03-19 15:41 by haoshis
[考研] 材料专硕274一志愿陕西师范大学求调剂 +8 薛云鹏 2026-03-13 8/400 2026-03-19 15:36 by haoshis
[考研] 266求调剂 +5 阳阳哇塞 2026-03-14 10/500 2026-03-19 15:08 by 阳阳哇塞
[考研] 一志愿天津大学化学工艺专业(081702)315分求调剂 +11 yangfz 2026-03-17 11/550 2026-03-19 15:06 by houyaoxu
[考研] 材料与化工求调剂 +7 为学666 2026-03-16 7/350 2026-03-19 14:48 by 尽舜尧1
[考研] 求调剂,一志愿:南京航空航天大学大学 ,080500材料科学与工程学硕,总分289分 +3 @taotao 2026-03-19 3/150 2026-03-19 14:07 by peike
[考研] 26调剂/材料/英一数二/总分289/已过A区线 +7 步川酷紫123 2026-03-13 7/350 2026-03-18 17:12 by 尽舜尧1
[考研] 085601专硕,总分342求调剂,地区不限 +5 share_joy 2026-03-16 5/250 2026-03-18 14:48 by haxia
[考研] 302求调剂 +10 呼呼呼。。。。 2026-03-17 10/500 2026-03-18 12:45 by Linda Hu
[考研] 304求调剂 +12 小熊joy 2026-03-14 13/650 2026-03-18 12:34 by Linda Hu
[考研] 277调剂 +5 自由煎饼果子 2026-03-16 6/300 2026-03-17 19:26 by 李leezz
[考研] 332求调剂 +6 Zz版 2026-03-13 6/300 2026-03-17 17:03 by ruiyingmiao
[考研] 302求调剂 +4 小贾同学123 2026-03-15 8/400 2026-03-17 10:33 by 小贾同学123
[论文投稿] 有没有大佬发小论文能带我个二作 +3 增锐漏人 2026-03-17 4/200 2026-03-17 09:26 by xs74101122
[考研] 304求调剂 +5 素年祭语 2026-03-15 5/250 2026-03-16 17:00 by 我的船我的海
[考研] 一志愿211 0703方向310分求调剂 +3 努力奋斗112 2026-03-15 3/150 2026-03-16 16:44 by houyaoxu
[考研] 0856专硕279求调剂 +5 加油加油!? 2026-03-15 5/250 2026-03-15 11:58 by 2020015
信息提示
请填处理意见