Метод стохастической аппроксимации.
График функции
Используем сетку значений x1 и x2, выведем график зависимости y от x1 и x2:
[x1, x2] = meshgrid(-10:0.1:10) y = 2.*x1.^2+5.*x2.^2+4.*x1.*x2-3.*x2+100*sin(x2); mesh(x1,x2,y)
Метод пошаговой регрессии.
aa = ones(1000,2);
u = ones(1000,2); u(:,2) = -50 + 100*rand(1000,1); n = -20 + 40*rand(1000,1);
x = 345.3 + 23.5*u(:,2) + n;
eps = 1/100000; I = [1 0; 0 1]; P = (1/eps)*I; A = [0;0];
for j = 1:1000 H = u(j,:)'; P = P - P*H*((1+H'*P*H)^(-1))*H'*P; A = A + P*H*(x(j)-H'*A); aa(j,:) = A'; end;
for i = 1:2 figure(i); plot(aa(:,i)); end;
Метод стохастической аппроксимации. aa = ones(1000,2);
u = ones(1000,2); u(:,2) = -50 + 100*rand(1000,1); n = -1 + 2*rand(1000,1);
x = 345.3 + 23.5*u(:,2) + n;
A = [300;10]; p1 = 1/(u(1,:)*u(1,:)');
for j = 1:1000 aa(j,:) = A'; g = u(j,:)'; pk = p1/j; A = A - pk*(A'*g - x(j))*g; end;
for i = 1:2 figure(i); plot(aa(:,i)); end;
3.1 Градиентный метод: function y = grmet(x1,x2,e) k=[0.2 0.02]; tr1=1; sg=[1 1]; sgo=sg; gro=[1 1]; cnt=0; while tr1 == 1 gr=grd(x1,x2); cnt=cnt+1;
for i=1:2 sg(i)=gr(i)/abs(gr(i)); sgo(i)=gro(i)/abs(gro(i)); if sg(i)~=sgo(i) k(i)=k(i)/2; end; end; x1=x1-k(1)*gr(1); x2=x2-k(2)*gr(2);
tr1=0; for i=1:2 if abs(gr(i))>e tr1=1; end; end; gro=gr; end; cnt=cnt; x1=x1; x2=x2; y=fnc(x1,x2);
grd.m: function y = grd(x1,x2) y=zeros(1,2); dx = 0.01; y(1)=(fnc(x1+dx,x2)-fnc(x1,x2))/dx; y(2)=(fnc(x1,x2+dx)-fnc(x1,x2))/dx;
Результат: >> grmet(-1,1,0.01)
cnt =
x1 =
1.4528
x2 =
-1.4583
ans =
-88.6130
3.2 Метод случайного поиска. function y = slmet(x11,x12,x21,x22,e,eps) k=1000; kk=50; ll=k/kk; pp=zeros(k,3); pb=zeros(kk,3); pp(:,1)=random('Uniform',x11,x12,k,1); pp(:,2)=random('Uniform',x21,x22,k,1); for i=1:k pp(i,3)=fnc(pp(i,1),pp(i,2)); end; pps=sortrows(pp,3); for i=1:kk pb(i,:)=pps(i,:); end; pbb=pb;
ee=eps+1; for jj=1:30 for i=1:kk x1=pb(i,1); x2=pb(i,2); for j=1:ll ii=20*(i-1)+j; pp(ii,1)=random('Uniform',x1-e,x1+e); pp(ii,2)=random('Uniform',x2-e,x2+e); pp(ii,3)=fnc(pp(ii,1),pp(ii,2)); end; end;
pps=sortrows(pp,3); for i=1:kk pb(i,:)=pps(i,:); end; ee=pb(kk,3)-pb(1,3) e=e/2; end; pbb1=pb(1,:)
Результат: >> slmet(2,2,1,3,0.00001,0.1)
ee =
0.3171
ee =
3.2815e-04
ee =
1.7234e-04
ee =
1.1234e-04
ee =
6.1348e-05
ee =
3.3949e-05
ee =
1.1029e-05
ee =
2.9950e-06
ee =
1.2780e-06
ee =
7.9049e-07
ee =
5.7580e-07
ee =
2.4792e-07
ee =
1.5398e-07
ee =
8.2611e-08
ee =
3.9961e-08
ee =
1.4813e-08
ee =
6.4421e-09
ee =
3.4250e-09
ee =
2.3881e-09
ee =
1.5482e-09
ee =
9.5352e-10
ee =
3.8213e-10
ee =
1.3775e-10
ee =
5.9032e-11
ee =
3.5627e-11
ee =
1.9384e-11
ee =
1.0374e-11
ee =
5.3717e-12
ee =
2.8990e-12
ee =
1.4637e-12
pbb1 =
2.0000 2.9990 82.1775
3.3 Метод циклического покоординатного спуска: function [x1,x2] = cps(x11,x12,x21,x22,e) x1=(x11+x12)/2; x2=(x21+x22)/2; fo=fnc(x1,x2); tr1=1; cnt=0; while tr1 == 1 cnt=cnt+1; x1=dih(x2,x11,x12,1); x2=dih(x1,x21,x22,0); ff=fnc(x1,x2) tr1=0; if abs(ff-fo)>e tr1=1; end; fo=ff; end; cnt=cnt xx1=x1 xx2=x2
dih.m: function x = dih(X,X1,X2,tr) d=0.01; while (abs(X1-X2)>d) s1=(X1+X2-d)/2; s2=(X1+X2+d)/2;
if tr>0 f1=fnc(s1,X); f2=fnc(s2,X); else f1=fnc(X,s1); f2=fnc(X,s2); end;
if f1>f2 X1=s2; else X2=s1; end; end; x=(X1+X2)/2;
Результат: >> cps(-13,24,-13,43,0.001)
ff =
312.9746
ff =
176.9161
ff =
96.6952
ff =
96.5437
ff =
96.5435
cnt =
xx1 =
7.3704
xx2 =
-7.3643
ans =
7.3704
3.4 Эволюционный метод: function s_code = gen_code(xx1,xx2,bx11,bx21) xd1=(xx1-bx11)*100000; xd2=(xx2-bx21)*100000; xb1=dec2bin(xd1,22); xb2=dec2bin(xd2,22); for hi=1:11 sp1t(hi)=xb1(hi); sp1b(hi)=xb1(hi+11); sp2t(hi)=xb2(hi); sp2b(hi)=xb2(hi+11); end; s_code=struct('t1',sp1t,'b1',sp1b,'t2',sp2t,'b2',sp2b);
Код fen_code.m: function f_code = fen_code(g_code,bx11,bx21) f_code = zeros(1,3); f_code(1,1) = bx11+bin2dec(g_code.h1)/100000; f_code(1,2) = bx21+bin2dec(g_code.h2)/100000; f_code(1,3) = fnc(f_code(1),f_code(2));
Код mutate.m: function ss = mutate(s,bd,m) for mi=1:m rd=round(random('Uniform',bd,22,1,1)); if s(rd)=='0' s(rd)='1'; else s(rd)='0'; end; end; ss=s;
Код slmet_ga.m: function y = slmet_ga(x11,x12,x21,x22,eps) k=1250; kk=50; ll=k/kk; pp=zeros(k,3); pb=zeros(kk,3); pp(:,1)=random('Uniform',x11,x12,k,1); pp(:,2)=random('Uniform',x21,x22,k,1); for i=1:k pp(i,3)=fnc(pp(i,1),pp(i,2)); end; pps=sortrows(pp,3); for i=1:kk pb(i,:)=pps(i,:); end; pbb=pb;
ee=eps+1; for jj=1:5 ni=0; for i=1:kk
sp=gen_code(pb(i,1),pb(i,2),x11,x21);
for j=i+1:kk
sm=gen_code(pb(j,1),pb(j,2),x11,x21);
ni=ni+1; gc=struct('h1',strcat(sp.t1,sm.b1),'h2',strcat(sp.t2,sm.b2)); gc.h1=mutate(gc.h1,6,5); gc.h2=mutate(gc.h2,6,5); pp(ni,:)=fen_code(gc,x11,x21);
end; end;
pps=sortrows(pp,3); for i=1:kk pb(i,:)=pps(i,:); end; ee=pb(kk,3)-pb(1,3) pbb1=pb end; pbb1=pb(1,:)
Результат: >> slmet_ga(1,4,2,3,0.001)
ee =
7.0862
pbb1 =
1.0499 3.3036 44.6068 1.0312 3.2933 44.9477 1.0908 3.3087 44.9974 1.0746 3.2976 45.4236 1.0361 3.2686 46.6395 1.1162 3.2876 46.7981 1.1228 3.2840 47.1469 1.1924 3.3007 47.3112 1.1212 3.2805 47.3499 1.1017 3.2749 47.3695 1.1201 3.2788 47.4371 1.0109 3.2491 47.4886 1.0900 3.2687 47.5653 1.0568 3.2576 47.7151 1.1665 3.2860 47.7937 1.2386 3.3051 47.8699 1.0361 3.2453 48.1708 1.1942 3.2877 48.1796 1.1472 3.2707 48.4388 1.0668 3.2466 48.6097 1.0256 3.2332 48.7915 1.1614 3.2672 48.9206 1.0948 3.2459 49.1426 1.2758 3.2926 49.3435 1.1532 3.2572 49.4249 1.0750 3.2352 49.5009 1.2187 3.2672 49.9430 1.0110 3.2096 50.1044 1.1226 3.2382 50.1342 1.1994 3.2567 50.2739 1.0566 3.2161 50.4490 1.1039 3.2266 50.5707 1.1453 3.2368 50.6176 1.3851 3.3032 50.6925 1.2571 3.2656 50.7336 1.4055 3.3082 50.7641 1.2612 3.2651 50.8442 1.1738 3.2394 50.9477 1.0343 3.2014 51.0455 1.0622 3.2085 51.0506 1.0567 3.2066 51.0799 1.1725 3.2365 51.1151 1.3746 3.2902 51.3173 1.3680 3.2863 51.4465 1.3403 3.2782 51.4500 1.2287 3.2462 51.4837 1.2846 3.2605 51.5649 1.3852 3.2894 51.5692 1.4440 3.3062 51.6152 1.3885 3.2884 51.6931
ee =
2.0627
pbb1 =
1.0320 3.3088 43.9599 1.0351 3.3067 44.1469 1.0380 3.3062 44.2285 1.0523 3.3067 44.4461 1.0332 3.2989 44.6180 1.0304 3.2979 44.6330 1.0160 3.2916 44.7993 1.0793 3.3075 44.8678 1.0364 3.2947 44.9448 1.0889 3.3087 44.9628 1.0907 3.3091 44.9653 1.0627 3.3010 44.9991 1.0404 3.2935 45.0902 1.0950 3.3079 45.1179 1.0166 3.2855 45.2053 1.0959 3.3068 45.2078 1.1001 3.3078 45.2146 1.0315 3.2891 45.2267 1.0891 3.3043 45.2451 1.0684 3.2981 45.2864 1.0796 3.3010 45.2933 1.0294 3.2875 45.2943 1.0605 3.2952 45.3302 1.0488 3.2917 45.3549 1.0803 3.2999 45.3752 1.0440 3.2894 45.4213 1.1052 3.3059 45.4291 1.0374 3.2874 45.4386 1.0139 3.2801 45.5088 1.0337 3.2849 45.5387 1.0360 3.2855 45.5401 1.0227 3.2813 45.5813 1.0292 3.2827 45.6001 1.0240 3.2807 45.6386 1.1272 3.3086 45.6466 1.1228 3.3066 45.6951 1.0498 3.2865 45.7088 1.0516 3.2868 45.7191 1.1062 3.3012 45.7473 1.0745 3.2918 45.7976 1.0695 3.2903 45.8051 1.0681 3.2884 45.9031 1.0670 3.2880 45.9117 1.0681 3.2882 45.9184 1.0880 3.2935 45.9233 1.0410 3.2808 45.9304 1.1425 3.3082 45.9435 1.0221 3.2754 45.9578 1.0116 3.2718 46.0128 1.0844 3.2910 46.0226
ee =
1.2658
pbb1 =
1.0090 3.3084 43.5884 1.0142 3.3087 43.6584 1.0254 3.3103 43.7460 1.0249 3.3098 43.7719 1.0191 3.3076 43.8120 1.0320 3.3104 43.8568 1.0321 3.3104 43.8575 1.0162 3.3056 43.8895 1.0079 3.3026 43.9474 1.0076 3.3012 44.0294 1.0026 3.2993 44.0675 1.0445 3.3099 44.1072 1.0267 3.3049 44.1221 1.0152 3.3018 44.1227 1.0340 3.3066 44.1354 1.0361 3.3068 44.1598 1.0465 3.3087 44.2156 1.0483 3.3092 44.2168 1.0123 3.2990 44.2523 1.0366 3.3052 44.2706 1.0215 3.3009 44.2865 1.0438 3.3064 44.3192 1.0502 3.3076 44.3540 1.0227 3.2999 44.3735 1.0539 3.3081 44.3844 1.0297 3.3013 44.4023 1.0180 3.2979 44.4221 1.0002 3.2928 44.4445 1.0239 3.2985 44.4840 1.0600 3.3079 44.5040 1.0259 3.2975 44.5823 1.0534 3.3048 44.5927 1.0444 3.3014 44.6537 1.0167 3.2939 44.6607 1.0773 3.3099 44.6821 1.0022 3.2896 44.6889 1.0089 3.2910 44.7131 1.0293 3.2964 44.7171 1.0508 3.3020 44.7266 1.0616 3.3048 44.7356 1.0500 3.3015 44.7467 1.0426 3.2993 44.7570 1.0732 3.3075 44.7610 1.0685 3.3061 44.7692 1.0068 3.2893 44.7832 1.0015 3.2878 44.7949 1.0327 3.2954 44.8361 1.0407 3.2974 44.8433 1.0526 3.3006 44.8468 1.0786 3.3075 44.8543
ee =
1.2224
pbb1 =
1.0009 3.3104 43.3204 1.0070 3.3090 43.5156 1.0073 3.3089 43.5268 1.0069 3.3086 43.5392 1.0093 3.3089 43.5595 1.0065 3.3077 43.5925 1.0003 3.3058 43.6077 1.0020 3.3062 43.6090 1.0007 3.3058 43.6114 1.0045 3.3060 43.6624 1.0216 3.3105 43.6733 1.0073 3.3065 43.6827 1.0070 3.3061 43.7033 1.0053 3.3043 43.7874 1.0097 3.3043 43.8676 1.0100 3.3037 43.9110 1.0097 3.3035 43.9147 1.0167 3.3050 43.9403 1.0271 3.3077 43.9455 1.0242 3.3068 43.9533 1.0011 3.3006 43.9553 1.0220 3.3061 43.9581 1.0092 3.3025 43.9712 1.0357 3.3094 43.9843 1.0144 3.3030 44.0276 1.0301 3.3063 44.0859 1.0114 3.3011 44.1040 1.0079 3.2999 44.1175 1.0456 3.3095 44.1538 1.0033 3.2979 44.1659 1.0372 3.3067 44.1867 1.0120 3.2998 44.1936 1.0024 3.2966 44.2387 1.0476 3.3086 44.2470 1.0509 3.3093 44.2595 1.0066 3.2973 44.2645 1.0273 3.3025 44.2872 1.0038 3.2961 44.2906 1.0249 3.3014 44.3151 1.0268 3.3018 44.3204 1.0180 3.2990 44.3511 1.0533 3.3084 44.3573 1.0207 3.2992 44.3842 1.0031 3.2945 44.3881 1.0636 3.3107 44.3892 1.0359 3.3029 44.4073 1.0279 3.3002 44.4425 1.0242 3.2990 44.4557 1.0398 3.3027 44.4886 1.0236 3.2975 44.5429
ee =
1.1061
pbb1 =
1.0036 3.3094 43.4315 1.0091 3.3090 43.5522 1.0047 3.3076 43.5610 1.0004 3.3060 43.5945 1.0070 3.3072 43.6324 1.0194 3.3103 43.6424 1.0106 3.3075 43.6749 1.0024 3.3053 43.6752 1.0131 3.3076 43.7089 1.0145 3.3077 43.7284 1.0245 3.3081 43.8726 1.0049 3.3020 43.9323 1.0168 3.3046 43.9682 1.0273 3.3073 43.9774 1.0035 3.3008 43.9826 1.0196 3.3051 43.9841 1.0057 3.3005 44.0428 1.0438 3.3106 44.0476 1.0205 3.3042 44.0588 1.0110 3.3016 44.0623 1.0300 3.3064 44.0801 1.0137 3.3013 44.1291 1.0173 3.3019 44.1480 1.0307 3.3051 44.1766 1.0175 3.3015 44.1835 1.0150 3.3005 44.2040 1.0057 3.2975 44.2354 1.0471 3.3086 44.2361 1.0061 3.2974 44.2507 1.0269 3.3026 44.2688 1.0519 3.3087 44.3158 1.0029 3.2955 44.3160 1.0408 3.3056 44.3204 1.0567 3.3099 44.3214 1.0326 3.3033 44.3278 1.0465 3.3069 44.3326 1.0537 3.3084 44.3647 1.0198 3.2992 44.3704 1.0220 3.2995 44.3874 1.0076 3.2954 44.4043 1.0082 3.2954 44.4136 1.0171 3.2977 44.4170 1.0380 3.3031 44.4292 1.0082 3.2946 44.4665 1.0177 3.2971 44.4698 1.0429 3.3031 44.5140 1.0661 3.3093 44.5221 1.0476 3.3042 44.5264 1.0331 3.3002 44.5371 1.0438 3.3030 44.5375
pbb1 =
1.0036 3.3094 43.4315
>>
|