複数の方程式からなる関数を用いたフィッティング方法
조회 수: 9 (최근 30일)
이전 댓글 표시
ある実測値に対して,複数の方程式(連立方程式)を用いてフィッティングを行うようにプログラミングしています.しかし,エラーが出て,なかなか解決できていません.エラーは「入力因数が不足している」とのことです.以下のプログラムを正常にするには,どのようにすれば良いでしょうか?
・関数1(目的関数):予備関数1(微分方程式)からAを算出し,Aから予備関数2(一次関数)を用いてsolを出力
・関数2:関数1における一部のパラメータを最適化変数にして,関数1を最適化関数にする.
その後,Bと実測値Bから最小二乗法で残差を計算し,最適化問題を作成する.
そして,Fitting変数を求める.
・エラー:最適化関数に変化するときに,入力因数不足となる;入力因数を増やしたり,減らしたり,ほかの変数にしたりしたが変化なし
[関数1]
function [T, sol] = fun(tspan, re, Azero, L, c, lambda, Vol, Vism);
re = optimvar('re',4,'LowerBound',0,'UpperBound',inf);
C = re(1);
S = re(2);
M1 = re(3);
M2 = re(4);
options = odeset('RelTol', 1e-6, 'AbsTol', 1e-9);
[T, Av] = ode45('Adot', tspan, tens2vec(Azero), options, L, C, c, lambda, S); %予備関数1 微分方程式
for i = 1:length(T);
[Tau(i,:), Eta(i,:)] = Lipscomb(Av(i,:), L, c,S, Vol, Vism, M1, M2); %予備関数2 線形方程式
end
sol = Eta(:,6);
end
[関数2]
function [C, S, a, Vsteady, M1, M2, Rt] = EFitting(tspan, Azero, L, c, lambda, Vol, Vism, Eta_exp);
type fun
re = optimvar('re',4,'LowerBound',0,'UpperBound',inf); フィッティングパラメータ
re(1).LowerBound = 0;
re(1).UpperBound = 1;
[T, sol] = fcn2optimexpr('fun', tspan, re, Azero, L, c, lambda, Vol, Vism); %関数1を最適化関数にする
for i = 1:length(T);
Eta_temp(i:1) = Eta_exp(i:3); %実測値の3列目を抽出
end
obj = sum(sum((sol - Eta_temp).^2));
prob = optimproblem("Objective",obj);
re0.re = [C S];
[resol,sumsq] = solve(prob,re0); %最適化関数を解く
C= resol(1); 出力1
S= resol(2); 出力2
end
댓글 수: 0
답변 (1개)
Shojiro SHIBAYAMA
2020년 7월 14일
この関数のドキュメント読むと,以下の利用例がありました.
myfcn = fcn2optimexpr(@RtoODE,r,tspan,y0);
これを踏まえると,
[T, sol] = fcn2optimexpr(@fun, tspan, re, Azero, L, c, lambda, Vol, Vism); %関数1を最適化関数にする
と書くと良いと思うのですが,いかがでしょうか.
また,MATLABエディタの左枠に行数横の短い横棒線をクリックすると,そこでプログラム実行を止めてデバッグが可能です.こちらも利用して問題発生箇所を特定すると良いと思います.
참고 항목
카테고리
Help Center 및 File Exchange에서 最小二乗法에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!