MATLAB에서 피팅
소개
실험 장치에서 얻은 신호에서 매개 변수를 추출하기 위해 피팅을 수행 할 수 있다고 생각합니다 (자주). 한편, 「만일 신호를 얻었는데 하는 방법을 모른다!」라고 하는 초보자도 계시는 것이 아닐까요. 사실, 나도 처음에는 무엇을 하면 좋을지 모르고 조사 조사로 어떻게든 할 수 있게 되었습니다. 본고에서는 그 퀵 스타트와 주의점을 말해, 즉시 걸릴 수 있도록(듯이) 하고 싶습니다.
이용하는 데이터와 해석식
여기서는 다양성을 고려하여 비선형 데이터를 사용합니다. 비선형 데이터가 가능하면 선형 데이터는 충분하지 않습니다.
(※선형 데이터는 다른 커맨드로 보다 간단하게 실시할 수 있습니다)
나중에 피팅을 이론식으로 수행하기 위해 이번에는 로렌츠 함수를 사용합니다. 데이터를 재현하는 이론식은 다음 식으로 표현된다.
y = S\frac{W^2}{(x-x_0)^2 + W^2} + A\frac{(x-x_0)W}{(x-x_0)^2 + W^2}
여기서,
$S$ : 대칭 로렌츠 함수의 계수
$A$ : 반대 대칭 로렌츠 함수의 계수
$x_0$ :$x$ 방향의 어긋남
$W$ : 신호 선폭(반값 반폭)
합니다.
이것들이 요구하고 싶은 파라미터입니다.
정말 피팅
피팅한 결과를 아래에 나타냈다.
위의 그림은 실험 데이터와 그 피팅입니다.
아래 그림은 피팅 데이터를 더 분해 한 것입니다 (이론식 참조).
이와 같이, 임의의 함수에 대해서, 이론식이 있으면 기본적으로 무엇이든 피팅할 수가 있습니다.
다만, 피팅의 방식(LM법 등), 피팅의 개시점의 유무에 따라서도 그 가부가 정해져 버리기 때문에, 적절히 파라미터를 조정할 필요가 있습니다.
코드
다음에 사용한 코드를 나타냅니다.
Fitting.mclc
clear all
#データのインポート
data = dlmread('4171003-12.txt100mW-7.0GHz.txt');
#データの前処理
N_data=size(data,1);
N_data1_end = N_data/2-N_data1_start;
N_data2_start = N_data/2+N_data1_start;
N_data2_end = N_data-N_data1_start;
for i = N_data1_start : N_data1_end
x1(i-N_data1_start+1) = data(i,1);
y1(i-N_data1_start+1) = data(i,2)*1e+6;
end
x1 = x1';
y1 = y1';
for j = N_data2_start : N_data2_end
x2(j-N_data2_start+1) = data(j,1);
y2(j-N_data2_start+1) = data(j,2)*1e+6;
end
x2 = x2';
y2 = y2';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%フィッティング形式の設定
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f1 = fitoptions('Methods','NonlinearLeastSquares',...
'StartPoint',[10 -50 40 10 0],...
'Algorithm','Levenberg-Marquardt')
f2 = fitoptions('Methods','NonlinearLeastSquares',...
'StartPoint',[10 50 -40 10 0],...
'Algorithm','Levenberg-Marquardt')
%フィッティング式
ft1 = fittype('S*W^2/((x-H_res)^2+W^2)+A*((x-H_res)*W)/((x-H_res)^2+W^2)+Y','options',f1);
ft2 = fittype('S*W^2/((x-H_res)^2+W^2)+A*((x-H_res)*W)/((x-H_res)^2+W^2)+Y','options',f2);
%フィッティングされるパラメータの確認(一度確認すればなくても良い)
coeff = coeffnames(ft1)
%フィッティング.引数に(x1,y1),フィッティング形式にft1などとする.
[curve1] = fit(x1,y1,ft1)
[curve2] = fit(x2,y2,ft2)
%フィッティングされたパラメータをparameter1, 2に格納.
parameter1 = coeffvalues(curve1);
parameter2 = coeffvalues(curve2);
%フィッティングパラメータを取り出し.
H1_res = parameter1(2);
S1 = parameter1(3);
A1 = parameter1(1);
W1 = parameter1(4);
Y1 = parameter1(5);
H2_res = parameter2(2);
S2 = parameter2(3);
A2 = parameter2(1);
W2 = parameter2(4);
Y2 = parameter2(5);
데이터 전처리는 데이터 형식에 따라 방법이 다릅니다.
MATLAB에서 사용하는 피팅에서는 x, y를 목록 형식으로 가지고 있으면 "fit (x, y, ft)"에 의해 무사히 할 수 있습니다.
얻은 파라미터를 사용하여 그래프로 만드는 것은 더 쉽게 할 수 있습니다 ~
Reference
이 문제에 관하여(MATLAB에서 피팅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/makki_maki04/items/2167e8279b9b163312e5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
y = S\frac{W^2}{(x-x_0)^2 + W^2} + A\frac{(x-x_0)W}{(x-x_0)^2 + W^2}
clc
clear all
#データのインポート
data = dlmread('4171003-12.txt100mW-7.0GHz.txt');
#データの前処理
N_data=size(data,1);
N_data1_end = N_data/2-N_data1_start;
N_data2_start = N_data/2+N_data1_start;
N_data2_end = N_data-N_data1_start;
for i = N_data1_start : N_data1_end
x1(i-N_data1_start+1) = data(i,1);
y1(i-N_data1_start+1) = data(i,2)*1e+6;
end
x1 = x1';
y1 = y1';
for j = N_data2_start : N_data2_end
x2(j-N_data2_start+1) = data(j,1);
y2(j-N_data2_start+1) = data(j,2)*1e+6;
end
x2 = x2';
y2 = y2';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%フィッティング形式の設定
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f1 = fitoptions('Methods','NonlinearLeastSquares',...
'StartPoint',[10 -50 40 10 0],...
'Algorithm','Levenberg-Marquardt')
f2 = fitoptions('Methods','NonlinearLeastSquares',...
'StartPoint',[10 50 -40 10 0],...
'Algorithm','Levenberg-Marquardt')
%フィッティング式
ft1 = fittype('S*W^2/((x-H_res)^2+W^2)+A*((x-H_res)*W)/((x-H_res)^2+W^2)+Y','options',f1);
ft2 = fittype('S*W^2/((x-H_res)^2+W^2)+A*((x-H_res)*W)/((x-H_res)^2+W^2)+Y','options',f2);
%フィッティングされるパラメータの確認(一度確認すればなくても良い)
coeff = coeffnames(ft1)
%フィッティング.引数に(x1,y1),フィッティング形式にft1などとする.
[curve1] = fit(x1,y1,ft1)
[curve2] = fit(x2,y2,ft2)
%フィッティングされたパラメータをparameter1, 2に格納.
parameter1 = coeffvalues(curve1);
parameter2 = coeffvalues(curve2);
%フィッティングパラメータを取り出し.
H1_res = parameter1(2);
S1 = parameter1(3);
A1 = parameter1(1);
W1 = parameter1(4);
Y1 = parameter1(5);
H2_res = parameter2(2);
S2 = parameter2(3);
A2 = parameter2(1);
W2 = parameter2(4);
Y2 = parameter2(5);
Reference
이 문제에 관하여(MATLAB에서 피팅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/makki_maki04/items/2167e8279b9b163312e5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)