【发布时间】:2019-12-15 01:29:36
【问题描述】:
我有这个牛顿算法,它似乎要花很长时间才能找到解决方案。以至于我让它坐了一整夜,什么也没发生。我想知道这是我做错了什么还是我遗漏了什么。
Gobs=[0.61 1.14 2.33 4.76 6.65 4.77 2.38 1.13 0.59];
x=[-3.0, -2.5, -2.0, -1.5, -1.0, -0.5, 0.0, 0.5, 1.5];
syms m h
p1=[m;h];
F = ((((6.67*p1(1)*p1(2))/((x(1)^2)+p1(2)^2)^(3/2))-Gobs(1))^2+(((6.67*p1(1)*p1(2))/((x(2)^2)+p1(2)^2)^(3/2))-Gobs(2))^2 + (((6.67*p1(1)*p1(2))/((x(3)^2)+p1(2)^2)^(3/2))-Gobs(3))^2 + (((6.67*p1(1)*p1(2))/((x(4)^2)+p1(2)^2)^(3/2))-Gobs(4))^2 + (((6.67*p1(1)*p1(2))/((x(5)^2)+p1(2)^2)^(3/2))-Gobs(5))^2 + (((6.67*p1(1)*p1(2))/((x(6)^2)+p1(2)^2)^(3/2))-Gobs(6))^2 + (((6.67*p1(1)*p1(2))/((x(7)^2)+p1(2)^2)^(3/2))-Gobs(7))^2 + (((6.67*p1(1)*p1(2))/((x(8)^2)+p1(2)^2)^(3/2))-Gobs(8))^2 + (((6.67*p1(1)*p1(2))/((x(9)^2)+p1(2)^2)^(3/2))-Gobs(9))^2);
dfm = diff(F,'m');
dfh = diff(F,'h');
d2fm = diff(dfm,'m');
d2fh = diff(dfh,'h');
dfmh = diff(dfm,'h');
dfhm = diff(dfh,'m');
G = [dfm;dfh];
Hnewton = [d2fm dfmh; dfmh d2fh];
m =1.6;
h =1.7;
p1 = subs(p1);
n=1;
tm(n)=p1(1);
th(n)=p1(2);
for i=1:2
F1 = subs(F);
p2 = p1-(subs(Hnewton)+ (100/n)*eye(2))\subs(G);
m=p2(1);
p=p2(2);
F2 = subs(F);
if (F2)>0.9;
p1 = p2;
m=p2(1);
h=p2(2);
else break
end
n=n+1;
tm(n)=p2(1);
th(n)=p2(2);
end
plot(th,tm,'r-','LineWidth',1.4)
【问题讨论】:
-
很难遵循您的代码,但是将所有内容都保留为符号变量总是会使代码非常慢。使用
diff找到所需的所有函数后,使用matlabFunction将它们转换为快速匿名函数。 -
哦,好吧,我会尽量不使用它们。我尝试转换,它说我不能使用非标量数组,我试图将其转换为单元格,但这也不起作用。
-
我尝试将它们转换为函数句柄,但是我在调整其余代码时遇到了问题。
-
@ChelseaG。matlab 中没有函数句柄的导数。
sym变量仅用于计算给定函数的gradient和hessian.在函数评估中,这两个被转换为函数句柄并确保它们的输入是向量 -
@MiroFeliciano 使用内置函数
gradient()和hessian。为了评估它们都被转换成函数句柄,不要使用subs。提供函数本身和优化的已知值,我会发布适当的答案。
标签: matlab newtons-method