Matlabでtwiddleを実装する

www.youtube.com

martin-thoma.com


まだ動いてないけどメモ

clear all; close all;

p =[0 0 0];
dp=[1 1 1];

best_err = run(p);
threshold = 0.001;

cnt = 1;
while sum(dp) > threshold
    for i=1:3
        p(i) = p(i) + dp(i);
        err = run(p);
        if err<best_err
            best_err = err;
            dp(i) = dp(i) * 1.1;
        else
            p(i) = p(i) - 2*dp(i);
            err = run(p);
            if err < best_err
                best_err = err;
                dp(i) = dp(i) * 1.05;
            else
                p(i) = p(i) + dp(i);
                dp(i) = dp(i) * 0.95;
            end
        end        
    end
    cnt = cnt+1;
    fprintf('step:%d, sum(dp):%f\n',cnt,sum(dp));
end
fprintf('kp:%f, ki:%f, kd:%f\n',p(1),p(2),p(3));

function err = run(p)
s = tf('s');
G = 1/(1-s+s^2);
kp = p(1);
ki = p(2);
kd = p(3);
C = kp + ki/s + kd*s;
Gc = 1/(1+C*G);
[y,t] = step(Gc);
err=abs(y(end)-1);
end

実行結果

>> twiddle
step:2, sum(dp):2.850000
step:3, sum(dp):2.707500
step:4, sum(dp):2.572125
step:5, sum(dp):2.443519
step:6, sum(dp):2.321343
step:7, sum(dp):2.205276
step:8, sum(dp):2.095012
step:9, sum(dp):1.990261
step:10, sum(dp):1.890748
step:11, sum(dp):1.796211
step:12, sum(dp):1.706400
step:13, sum(dp):1.621080
step:14, sum(dp):1.540026
step:15, sum(dp):1.463025
step:16, sum(dp):1.389874
step:17, sum(dp):1.320380
step:18, sum(dp):1.254361
step:19, sum(dp):1.191643
step:20, sum(dp):1.132061
step:21, sum(dp):1.075458
step:22, sum(dp):1.021685
step:23, sum(dp):0.970601
step:24, sum(dp):0.922071
step:25, sum(dp):0.875967
step:26, sum(dp):0.832169
step:27, sum(dp):0.790560
step:28, sum(dp):0.751032
step:29, sum(dp):0.713481
step:30, sum(dp):0.677807
step:31, sum(dp):0.643916
step:32, sum(dp):0.611720
step:33, sum(dp):0.581134
step:34, sum(dp):0.552078
step:35, sum(dp):0.524474
step:36, sum(dp):0.498250
step:37, sum(dp):0.473338
step:38, sum(dp):0.449671
step:39, sum(dp):0.427187
step:40, sum(dp):0.405828
step:41, sum(dp):0.385536
step:42, sum(dp):0.366260
step:43, sum(dp):0.347947
step:44, sum(dp):0.330549
step:45, sum(dp):0.314022
step:46, sum(dp):0.298321
step:47, sum(dp):0.283405
step:48, sum(dp):0.269234
step:49, sum(dp):0.255773
step:50, sum(dp):0.242984
step:51, sum(dp):0.230835
step:52, sum(dp):0.219293
step:53, sum(dp):0.208329
step:54, sum(dp):0.197912
step:55, sum(dp):0.188016
step:56, sum(dp):0.178616
step:57, sum(dp):0.169685
step:58, sum(dp):0.161201
step:59, sum(dp):0.153141
step:60, sum(dp):0.145484
step:61, sum(dp):0.138209
step:62, sum(dp):0.131299
step:63, sum(dp):0.124734
step:64, sum(dp):0.118497
step:65, sum(dp):0.112572
step:66, sum(dp):0.106944
step:67, sum(dp):0.101597
step:68, sum(dp):0.096517
step:69, sum(dp):0.091691
step:70, sum(dp):0.087106
step:71, sum(dp):0.082751
step:72, sum(dp):0.078614
step:73, sum(dp):0.074683
step:74, sum(dp):0.070949
step:75, sum(dp):0.067401
step:76, sum(dp):0.064031
step:77, sum(dp):0.060830
step:78, sum(dp):0.057788
step:79, sum(dp):0.054899
step:80, sum(dp):0.052154
step:81, sum(dp):0.049546
step:82, sum(dp):0.047069
step:83, sum(dp):0.044715
step:84, sum(dp):0.042480
step:85, sum(dp):0.040356
step:86, sum(dp):0.038338
step:87, sum(dp):0.036421
step:88, sum(dp):0.034600
step:89, sum(dp):0.032870
step:90, sum(dp):0.031226
step:91, sum(dp):0.029665
step:92, sum(dp):0.028182
step:93, sum(dp):0.026773
step:94, sum(dp):0.025434
step:95, sum(dp):0.024162
step:96, sum(dp):0.022954
step:97, sum(dp):0.021807
step:98, sum(dp):0.020716
step:99, sum(dp):0.019680
step:100, sum(dp):0.018696
step:101, sum(dp):0.017762
step:102, sum(dp):0.016874
step:103, sum(dp):0.016030
step:104, sum(dp):0.015228
step:105, sum(dp):0.014467
step:106, sum(dp):0.013744
step:107, sum(dp):0.013056
step:108, sum(dp):0.012404
step:109, sum(dp):0.011783
step:110, sum(dp):0.011194
step:111, sum(dp):0.010635
step:112, sum(dp):0.010103
step:113, sum(dp):0.009598
step:114, sum(dp):0.009118
step:115, sum(dp):0.008662
step:116, sum(dp):0.008229
step:117, sum(dp):0.007817
step:118, sum(dp):0.007426
step:119, sum(dp):0.007055
step:120, sum(dp):0.006702
step:121, sum(dp):0.006367
step:122, sum(dp):0.006049
step:123, sum(dp):0.005746
step:124, sum(dp):0.005459
step:125, sum(dp):0.005186
step:126, sum(dp):0.004927
step:127, sum(dp):0.004681
step:128, sum(dp):0.004447
step:129, sum(dp):0.004224
step:130, sum(dp):0.004013
step:131, sum(dp):0.003812
step:132, sum(dp):0.003622
step:133, sum(dp):0.003441
step:134, sum(dp):0.003269
step:135, sum(dp):0.003105
step:136, sum(dp):0.002950
step:137, sum(dp):0.002802
step:138, sum(dp):0.002662
step:139, sum(dp):0.002529
step:140, sum(dp):0.002403
step:141, sum(dp):0.002283
step:142, sum(dp):0.002168
step:143, sum(dp):0.002060
step:144, sum(dp):0.001957
step:145, sum(dp):0.001859
step:146, sum(dp):0.001766
step:147, sum(dp):0.001678
step:148, sum(dp):0.001594
step:149, sum(dp):0.001514
step:150, sum(dp):0.001439
step:151, sum(dp):0.001367
step:152, sum(dp):0.001298
step:153, sum(dp):0.001233
step:154, sum(dp):0.001172
step:155, sum(dp):0.001113
step:156, sum(dp):0.001057
step:157, sum(dp):0.001005
step:158, sum(dp):0.000954
kp:0.000000, ki:0.000000, kd:0.000000