Main Content

비선형 최소제곱, 문제 기반

이 예제에서는 문제 기반 최적화 워크플로를 사용하여 비선형 최소제곱 곡선 피팅을 수행하는 방법을 보여줍니다.

모델

이 문제의 모델 방정식은 다음과 같습니다.

y(t)=A1exp(r1t)+A2exp(r2t),

여기서 A1, A2, r1, r2는 알려지지 않은 파라미터이며, y는 응답 변수, t는 시간입니다. 이 문제를 풀려면 시간 데이터 tdata와 (잡음 있는) 응답 측정 데이터 ydata가 필요합니다. 최상의 Ar을 찾는 것이 목적이며 이는 다음을 최소화하는 값을 의미합니다.

ttdata(y(t)-ydata)2.

샘플 데이터

대개 문제를 설명하는 데이터가 있습니다. 이 경우 문제에 대해 인위적으로 잡음이 있는 데이터를 생성합니다. A = [1,2]r = [-1,-3]을 기본 값으로 사용하고 시간 데이터로 0에서 3 사이의 랜덤 값 200개를 사용합니다. 결과 데이터 점을 플로팅합니다.

rng default % For reproducibility
A = [1,2];
r = [-1,-3];
tdata = 3*rand(200,1);
tdata = sort(tdata); % Increasing times for easier plotting
noisedata = 0.05*randn(size(tdata)); % Artificial noise
ydata = A(1)*exp(r(1)*tdata) + A(2)*exp(r(2)*tdata) + noisedata;
plot(tdata,ydata,'r*')
xlabel 't'
ylabel 'Response'

Figure contains an axes object. The axes object contains an object of type line.

데이터에 잡음이 있습니다. 따라서, 해가 원래 파라미터 Ar과 완전히 일치하지 않을 수 있습니다.

문제 기반 접근법

최적의 파라미터 Ar을 구하기 위해 먼저 이러한 이름을 가진 최적화 변수를 정의합니다.

A = optimvar('A',2);
r = optimvar('r',2);

목적 함수의 표현식을 만듭니다. 이 함수는 최소화할 제곱합입니다.

fun = A(1)*exp(r(1)*tdata) + A(2)*exp(r(2)*tdata);
obj = sum((fun - ydata).^2);

목적 함수 obj를 사용하는 최적화 문제를 만듭니다.

lsqproblem = optimproblem("Objective",obj);

문제 기반 접근법에서는 초기점을 구조체로 지정하고 변수 이름을 구조체 필드로 사용합니다. 초기값 A = [1/2,3/2]과 초기값 r = [-1/2,-3/2]을 지정합니다.

x0.A = [1/2,3/2];
x0.r = [-1/2,-3/2];

문제 정식화를 검토합니다.

show(lsqproblem)
  OptimizationProblem : 

	Solve for:
       A, r

	minimize :
       sum(arg6)

       where:

         arg5 = extraParams{3};
         arg6 = (((A(1) .* exp((r(1) .* extraParams{1})))
     + (A(2) .* exp((r(2) .* extraParams{2})))) - arg5).^2;

         extraParams{1}:

         0.0139
         0.0357
         0.0462
         0.0955
         0.1033
         0.1071
         0.1291
         0.1385
         0.1490
         0.1619
         0.1793
         0.2276
         0.2279
         0.2345
         0.2434
         0.2515
         0.2533
         0.2894
         0.2914
         0.2926
         0.3200
         0.3336
         0.3570
         0.3700
         0.3810
         0.3897
         0.3959
         0.4082
         0.4159
         0.4257
         0.4349
         0.4366
         0.4479
         0.4571
         0.4728
         0.4865
         0.4878
         0.4969
         0.5070
         0.5136
         0.5455
         0.5505
         0.5517
         0.5606
         0.5669
         0.5898
         0.6714
         0.6869
         0.7043
         0.7197
         0.7199
         0.7251
         0.7306
         0.7533
         0.7628
         0.7653
         0.7725
         0.7796
         0.7889
         0.7914
         0.8281
         0.8308
         0.8355
         0.8575
         0.8890
         0.9190
         0.9336
         0.9513
         1.0114
         1.0132
         1.0212
         1.0500
         1.0529
         1.0550
         1.0595
         1.1055
         1.1077
         1.1413
         1.1447
         1.1692
         1.1767
         1.1993
         1.2054
         1.2117
         1.2518
         1.2653
         1.2942
         1.3076
         1.3162
         1.3280
         1.3368
         1.3404
         1.3516
         1.3528
         1.4082
         1.4199
         1.4561
         1.4604
         1.4678
         1.4693
         1.4726
         1.4951
         1.5179
         1.5255
         1.5323
         1.5397
         1.5856
         1.5924
         1.6150
         1.6406
         1.6410
         1.6416
         1.6492
         1.6496
         1.7035
         1.7065
         1.7256
         1.7391
         1.7558
         1.7558
         1.8059
         1.8481
         1.8662
         1.8769
         1.8971
         1.9389
         1.9432
         1.9473
         1.9622
         1.9653
         1.9664
         1.9672
         2.0362
         2.0391
         2.0603
         2.0676
         2.0845
         2.0972
         2.1181
         2.1281
         2.1952
         2.2294
         2.2341
         2.2445
         2.2538
         2.2612
         2.2641
         2.2716
         2.2732
         2.2966
         2.3247
         2.3271
         2.3375
         2.3407
         2.3408
         2.3766
         2.3829
         2.3845
         2.3856
         2.4002
         2.4008
         2.4429
         2.4442
         2.4519
         2.4529
         2.4636
         2.4704
         2.4775
         2.4925
         2.5222
         2.5474
         2.5591
         2.6061
         2.6079
         2.6727
         2.7002
         2.7081
         2.7174
         2.7319
         2.7400
         2.7401
         2.7472
         2.7516
         2.7878
         2.7882
         2.8020
         2.8020
         2.8262
         2.8344
         2.8507
         2.8684
         2.8715
         2.8725
         2.8779
         2.8785
         2.8792
         2.8857
         2.8947
         2.9118
         2.9884

       extraParams{2}:

         0.0139
         0.0357
         0.0462
         0.0955
         0.1033
         0.1071
         0.1291
         0.1385
         0.1490
         0.1619
         0.1793
         0.2276
         0.2279
         0.2345
         0.2434
         0.2515
         0.2533
         0.2894
         0.2914
         0.2926
         0.3200
         0.3336
         0.3570
         0.3700
         0.3810
         0.3897
         0.3959
         0.4082
         0.4159
         0.4257
         0.4349
         0.4366
         0.4479
         0.4571
         0.4728
         0.4865
         0.4878
         0.4969
         0.5070
         0.5136
         0.5455
         0.5505
         0.5517
         0.5606
         0.5669
         0.5898
         0.6714
         0.6869
         0.7043
         0.7197
         0.7199
         0.7251
         0.7306
         0.7533
         0.7628
         0.7653
         0.7725
         0.7796
         0.7889
         0.7914
         0.8281
         0.8308
         0.8355
         0.8575
         0.8890
         0.9190
         0.9336
         0.9513
         1.0114
         1.0132
         1.0212
         1.0500
         1.0529
         1.0550
         1.0595
         1.1055
         1.1077
         1.1413
         1.1447
         1.1692
         1.1767
         1.1993
         1.2054
         1.2117
         1.2518
         1.2653
         1.2942
         1.3076
         1.3162
         1.3280
         1.3368
         1.3404
         1.3516
         1.3528
         1.4082
         1.4199
         1.4561
         1.4604
         1.4678
         1.4693
         1.4726
         1.4951
         1.5179
         1.5255
         1.5323
         1.5397
         1.5856
         1.5924
         1.6150
         1.6406
         1.6410
         1.6416
         1.6492
         1.6496
         1.7035
         1.7065
         1.7256
         1.7391
         1.7558
         1.7558
         1.8059
         1.8481
         1.8662
         1.8769
         1.8971
         1.9389
         1.9432
         1.9473
         1.9622
         1.9653
         1.9664
         1.9672
         2.0362
         2.0391
         2.0603
         2.0676
         2.0845
         2.0972
         2.1181
         2.1281
         2.1952
         2.2294
         2.2341
         2.2445
         2.2538
         2.2612
         2.2641
         2.2716
         2.2732
         2.2966
         2.3247
         2.3271
         2.3375
         2.3407
         2.3408
         2.3766
         2.3829
         2.3845
         2.3856
         2.4002
         2.4008
         2.4429
         2.4442
         2.4519
         2.4529
         2.4636
         2.4704
         2.4775
         2.4925
         2.5222
         2.5474
         2.5591
         2.6061
         2.6079
         2.6727
         2.7002
         2.7081
         2.7174
         2.7319
         2.7400
         2.7401
         2.7472
         2.7516
         2.7878
         2.7882
         2.8020
         2.8020
         2.8262
         2.8344
         2.8507
         2.8684
         2.8715
         2.8725
         2.8779
         2.8785
         2.8792
         2.8857
         2.8947
         2.9118
         2.9884

       extraParams{3}:

         2.9278
         2.7513
         2.7272
         2.4199
         2.3172
         2.3961
         2.2522
         2.1974
         2.1666
         2.0944
         1.9566
         1.7989
         1.7984
         1.7540
         1.8318
         1.6745
         1.6874
         1.5526
         1.5229
         1.5680
         1.4784
         1.5280
         1.3727
         1.2968
         1.4012
         1.3602
         1.2714
         1.1773
         1.2119
         1.2033
         1.2037
         1.1729
         1.1829
         1.1602
         1.0448
         1.0320
         1.0397
         1.0334
         1.0233
         1.0275
         0.8173
         0.9373
         1.0202
         0.8896
         0.9791
         0.9128
         0.7763
         0.7669
         0.6579
         0.7135
         0.7978
         0.7164
         0.7071
         0.6429
         0.6676
         0.6782
         0.6802
         0.6328
         0.6301
         0.7406
         0.4908
         0.7126
         0.6136
         0.6269
         0.4668
         0.4963
         0.5007
         0.5226
         0.3764
         0.4824
         0.3930
         0.4390
         0.4665
         0.4490
         0.4841
         0.4539
         0.3698
         0.3974
         0.3356
         0.3045
         0.4131
         0.3561
         0.3506
         0.3960
         0.3625
         0.3446
         0.3778
         0.3565
         0.3187
         0.2677
         0.2664
         0.3572
         0.2129
         0.2919
         0.1764
         0.3210
         0.3016
         0.2572
         0.2514
         0.1301
         0.2825
         0.1372
         0.1243
         0.2421
         0.1888
         0.2547
         0.2559
         0.2632
         0.1801
         0.2309
         0.2134
         0.2495
         0.2332
         0.2512
         0.1875
         0.1861
         0.2397
         0.0803
         0.1579
         0.1196
         0.1541
         0.1978
         0.2034
         0.1095
         0.1332
         0.1567
         0.1345
         0.1635
         0.1661
         0.0991
         0.1366
         0.0387
         0.1922
         0.1031
         0.0714
         0.1178
         0.0568
         0.1255
         0.0957
         0.2313
         0.1710
        -0.0148
         0.1316
         0.0385
         0.0946
         0.1147
         0.1436
         0.0917
         0.1840
         0.0786
         0.1161
         0.1327
         0.1026
         0.1421
         0.1142
         0.0553
         0.0036
         0.1866
         0.0634
         0.0974
         0.1203
         0.0939
         0.0429
         0.0640
         0.0811
         0.1603
         0.0427
         0.1244
         0.0993
         0.0696
         0.0264
         0.0641
         0.0703
         0.0010
         0.0793
         0.0267
         0.0625
         0.0834
         0.0204
         0.0507
         0.0826
        -0.0272
         0.1161
         0.1832
         0.1100
         0.0453
         0.0826
         0.0079
         0.1531
         0.1052
         0.0965
         0.0132
         0.0729
         0.0287
         0.0410
         0.0280
         0.0049
         0.0102
         0.0442
        -0.0343

문제 기반 해

문제를 풉니다.

[sol,fval] = solve(lsqproblem,x0)
Solving problem using lsqnonlin.

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
sol = struct with fields:
    A: [2x1 double]
    r: [2x1 double]

fval = 0.4724

결과 해와 원래 데이터를 플로팅합니다.

figure
responsedata = evaluate(fun,sol);
plot(tdata,ydata,'r*',tdata,responsedata,'b-')
legend('Original Data','Fitted Curve')
xlabel 't'
ylabel 'Response'
title("Fitted Response")

Figure contains an axes object. The axes object with title Fitted Response contains 2 objects of type line. These objects represent Original Data, Fitted Curve.

이 플롯은 피팅된 데이터가 원래 잡음이 있는 데이터와 상당히 잘 일치함을 보여줍니다.

피팅된 파라미터가 원래 파라미터 A = [1,2]r = [-1,-3]과 얼마나 근접한지 살펴보십시오.

disp(sol.A)
    1.1615
    1.8629
disp(sol.r)
   -1.0882
   -3.2256

피팅된 파라미터는 A의 경우 약 15%, r의 경우 약 8% 차이가 납니다.

지원되지 않는 함수는 fcn2optimexpr을 필요로 함

목적 함수가 기본 함수로 구성되지 않은 경우 fcn2optimexpr을 사용하여 함수를 최적화 표현식으로 변환해야 합니다. Convert Nonlinear Function to Optimization Expression 항목을 참조하십시오. 현재 예제의 경우 다음과 같습니다.

fun = @(A,r) A(1)*exp(r(1)*tdata) + A(2)*exp(r(2)*tdata);
response = fcn2optimexpr(fun,A,r);
obj = sum((response - ydata).^2);

문제 풀이의 나머지 단계는 동일합니다. 유일한 차이점은 플로팅 루틴에서 fun 대신 response를 호출하는 것입니다.

responsedata = evaluate(response,sol);

지원되는 함수 목록은 Supported Operations for Optimization Variables and Expressions 항목을 참조하십시오.

참고 항목

관련 항목