数学建模社区-数学中国
标题:
问下大神这是个用模拟退火坐的非线性拟合函数哪里错了呀
[打印本页]
作者:
曹某某
时间:
2014-8-7 11:21
标题:
问下大神这是个用模拟退火坐的非线性拟合函数哪里错了呀
function [err] = h(sol) %构造目标函数
t = 1:14;
L = [1016.1 84.89 553.4 339.7 268.5 414.7 416.3 317.5 242.2 141.2 80.4 115.9 70.3 22.9];
[m,n] = size (L) ;
err = zeros(1,n) ;
A = sol(1) ; B = sol(2)
err = 0;
for i = 1: n
err = err + (L(i) - 10.^(A +B*i)).^2
err
end
close all %主程序
clear
bound = [0 -1;4 0];
[m,n] = size(bound) ;
D = bound (1, 1: n) ;
U = bound (2, 1: n) ;
for i = 1: n
x1 ( i) =D ( i) + rand*(U ( i) - D ( i) ) ;
end
x1
N = 1;
T = 1000;
T0 = 01001;
k = 250;
a = 01965;
step = 01001;
T1 = clock;
s = sprintf ('程序运行正在进行,请稍等……') ;
disp ( s) ;
while T > T0
for t = 1: k
f1 = h ( x1) ;
for i = 1: n
x2 ( i) = x1 ( i) + step*( rand - 0.5) ;
while x2 ( i) <D ( i) || x2 ( i) >U ( i)
x2 ( i) = x1 ( i) + step*( rand - 015) ;
end
end
f2 = h ( x2) ;
if f2 - f1 < 0
x1 = x2;
elseif exp ( ( f1 - f2) /T) > rand
x1 = x2;
end
temp_x( t, 1: n) = x1;
temp_y( t, 1) = h ( x1) ;
end
[ ty, ti ] =min ( temp_y) ;
x1 = temp_x( ti, 1: n) ;
X (N, 1: n) = x1;
Y(N) = h ( x1) ;
N =N + 1;
T = a
3
T;
end
T2 = clock;
CostTime = T2 - T1;
if CostTime (6) < 0
CostTime (6) =CostTime (6) + 60;
CostTime (5) =CostTime (5) - 1;
end
if CostTime (5) < 0
CostTime (5) = CostTime ( 5) + 60; CostTime ( 4) = Cost2
Time (4) - 1;
end
问下大神这是个用模拟退火坐的非线性拟合函数哪里错了呀
作者:
madio
时间:
2014-8-7 11:22
试了一下,程序可以运行呀,你把它保存为一个h.m的文件,然后再matlab的命令行中就可以调用函数,不过误差是比较大的,你是不是说这个问题?下面是运行的过程
>> h([10,5])
B =
5
err =
1.0000e+030
err =
1.0000e+030
err =
1.0000e+040
err =
1.0000e+040
err =
1.0000e+050
err =
1.0000e+050
err =
1.0000e+060
err =
1.0000e+060
err =
1.0000e+070
err =
1.0000e+070
err =
1.0000e+080
err =
1.0000e+080
err =
1.0000e+090
err =
1.0000e+090
err =
1.0000e+100
err =
1.0000e+100
err =
1.0000e+110
err =
1.0000e+110
err =
1.0000e+120
err =
1.0000e+120
err =
1.0000e+130
err =
1.0000e+130
err =
1.0000e+140
err =
1.0000e+140
err =
1.0000e+150
err =
1.0000e+150
err =
1.0000e+160
err =
1.0000e+160
x1 =
3.2589 -0.0942
程序运行正在进行,请稍等……
作者:
曹某某
时间:
2014-8-7 16:09
madio 发表于 2014-8-7 16:03
试了一下,程序可以运行呀,你把它保存为一个h.m的文件,然后再matlab的命令行中就可以调用函数,不过误差是 ...
大神我们那个运行初始应该是1000,但是我们没敢用1000用的300,运行后就说已达到最大递归限制 300。使用 set(0,'RecursionLimit',N) 可更改此限制。请注意,超出可用堆栈空间可能会使 MATLAB 和/或计算机崩溃。
而且这是在matlab的2014做的如果用到matlab7.0中就显示第六行出错~~我们也不知道为啥
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5