| 查看: 1886 | 回复: 8 | |||
[求助]
用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 |
» 猜你喜欢
070200求调剂,一志愿某211,288分
已经有20人回复
法国博士后职位
已经有0人回复
物理学I论文润色/翻译怎么收费?
已经有233人回复
重庆交大26年硕士生招生拟调剂通知已出!欢迎加入机器视觉与3D光学成像课题组。
已经有0人回复
**
已经有1人回复
0702一志愿吉大B区求调剂 本科期间发表一篇Sci
已经有3人回复
基底STO,薄膜SRO,XRD里面的振荡,是laue震荡还是kiessig振荡? 怎么判断?
已经有2人回复
B区学生调剂-兰州交通大学材料科学与工程学院
已经有8人回复
山西大同大学物理学专业还有调剂名额,欢迎调剂!
已经有9人回复
桂林理工大学物理学专业招收调剂
已经有7人回复
» 本主题相关价值贴推荐,对您同样有帮助:
用Gauss-Neuton算法解非线形最小二乘法问题
已经有0人回复
yongcailiu
金虫 (小有名气)
- 应助: 63 (初中生)
- 金币: 2283.9
- 红花: 10
- 帖子: 181
- 在线: 250.4小时
- 虫号: 1406563
- 注册: 2011-09-18
- 性别: GG
- 专业: 计算数学与科学工程计算
2楼2015-01-23 08:56:32
|
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
yongcailiu
金虫 (小有名气)
- 应助: 63 (初中生)
- 金币: 2283.9
- 红花: 10
- 帖子: 181
- 在线: 250.4小时
- 虫号: 1406563
- 注册: 2011-09-18
- 性别: GG
- 专业: 计算数学与科学工程计算
4楼2015-01-24 11:14:35
5楼2015-01-25 09:45:11
yongcailiu
金虫 (小有名气)
- 应助: 63 (初中生)
- 金币: 2283.9
- 红花: 10
- 帖子: 181
- 在线: 250.4小时
- 虫号: 1406563
- 注册: 2011-09-18
- 性别: GG
- 专业: 计算数学与科学工程计算
6楼2015-01-25 11:48:41
|
一直在关注帖子,可就是没看到回复,真是囧。。 按照你的建议试了试,如果在命令窗口中输入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
yongcailiu
金虫 (小有名气)
- 应助: 63 (初中生)
- 金币: 2283.9
- 红花: 10
- 帖子: 181
- 在线: 250.4小时
- 虫号: 1406563
- 注册: 2011-09-18
- 性别: GG
- 专业: 计算数学与科学工程计算
8楼2015-01-27 09:46:23
9楼2015-01-27 14:57:16













回复此楼
5