안녕하세요,
측정된 데이터를 삼각 Ksin(ax+b)+c 함수에 맞추는 데 어려움을 겪고 있습니다. 이것은 내 프로세스의 특성이며 jsl 코드에 맞는 자동 방법을 찾고 있습니다.
진동이 -1과 1 사이가 되도록 데이터를 정규화하는 코드를 작성했습니다.
결국 나는 및 b 상수를 얻고 싶습니다 (K와 c도 마찬가지이지만 훨씬 쉽습니다)
내 데이터 유형에 대한 첨부된 예입니다.
브,
요아브
이것이 당신이 원하는 것인지 모르겠지만 비선형 플랫폼을 사용하여 이것을 해결할 수 있습니다.첨부된 데이터는 예측 변수 열(매개변수를 사용하여 추정) 및 해당 매개변수를 해결하는 스크립트입니다.솔루션이 수렴되도록 하는 매개변수에 대한 초기 추측을 얻는 데 꽤 오랜 시간이 걸렸다는 점을 인정합니다(아마도 사인 함수에 익숙하지 않았기 때문일 것입니다. 그런 함수로 작업한 지 오래되었습니다).그러나 개념적으로 비선형 플랫폼은 원하는 것을 달성할 것입니다.
견적을 구하는 방법은 다음과 같습니다. NS FFT 기능을 사용하는 매개변수. 초 및 시간에 대한 설명은 데이터가 약 1시간 동안 약 4초마다 수집되었다고 가정합니다. FFT는 단위에 신경 쓰지 않습니다. FFT는 DC 오프셋 빈 다음의 첫 번째 빈이 입력 데이터에서 하나의 완전한 사이클을 만들 수 있는 가장 낮은 주파수를 나타내고, 다음 빈이 2개의 완전한 사이클이 되도록 데이터의 주파수를 비닝합니다. ... 중간 빈은 ndata/입니다. 2주기. 이후의 쓰레기통은 첫 번째의 거울입니다.
dt = Open( "z:\example data.jmp" );
// by hand, I made a formula column to look at x-lag(x) and
// decided the first 79 and last 8 were not representative...
rowstart = 80;
rowstop = 937;
timeStart = dt:x[rowstart];
timeStop = dt:x[rowstop];
ydata = dt[rowstart :: rowstop, {y}]; // throw away a few with irregular time
{r, i} = FFT( {ydata} );
nBins = N Items( r );
sampleRate = (timeStop - timeStart) / (nBins - 1); // imagine there were only 2 bins...thus -1.
// the samplerate is ~4 seconds/sample...
// the highest frequency this can resolve is 1 cycle/ 8 seconds. (.125 Hz)
// frequencies higher than that will cause aliasing unless they are filtered out before this.
// the bin [nBins/2] represents the maximum frequency that can be resolved
lastBinFrequency = 1 / (2 * sampleRate); // ~ 0.125 Hz
// the first bin [1] is the DC, or offset from 0, component. We'll ignore it.
// the next bin [2] represents the frequency that has one cycle over the length of the data.
// the lowest non-DC frequency is one cycle per hour (the length of time the data was collected).
binWidth = 1 / (timeStop - timeStart); // ~0.0003Hz, or ~1 cycle per hour
// note: lastBinFrequency == (nbins-1)*binWidth/2 -- each bin is this wide, in frequency
// the remaining bins are a mirror of the first and ignored.
// combine real and imaginary bin components to get an amplitude
p = Sqrt( r ^ 2 + i ^ 2 );
dtGraph2 = As Table( ((rowstart :: rowstop) - rowstart)` || p );
dtGraph2 << Graph Builder(
Size( 1300, 500 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Col1 ), Y( :Col2 ) ),
Elements( Points( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch( {}, "Col1", ScaleBox, {Format( "Best", 12 ), Min( 0 ), Max( nBins / 2 ), Inc( 100 ), Minor Ticks( 4 )} ),
Dispatch( {}, "Col2", ScaleBox, {Format( "Best", 12 ), Min( 0 ), Max( 30000 ), Inc( 5000 ), Minor Ticks( 1 )} ),
Dispatch( {}, "graph title", TextEditBox, {Set Text( "FFT Bins" )} ),
Dispatch( {}, "X title", TextEditBox, {Set Text( "bin number" )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "size" )} )
)
);
// there is a stong DC component in this data (all values > 0) so bin 1 is the max.
If( Loc Max( p ) != 1,
Throw( "something odd" )
);
p[1] = 0; // clear the DC value
// next max after DC:
maxBinIndex = Loc Max( p ); // 5. the data repeats about (5-1)==4 times in this frame.
Write(
"\!nBiggest frequency component at ",
binWidth * (maxBinIndex - 1),
" Hz or ",
Round( 1 / (binWidth * (maxBinIndex - 1)) ),
" seconds per cycle"
);
// where does a==.007 come from?
secondsPerCycle = 1 / (binWidth * (maxBinIndex - 1));
totalSeconds = timeStop-timeStart;
cyclesInSample = totalSeconds/secondsPerCycle;//about 4
timerange = timeStop-timeStart;
a_from_fft = cyclesInSample*2*pi()/timerange; // .0073...
show(a_from_fft);
DC bin 다음 4번째 bin에서 하나의 강력한 응답
0.00116448326055313Hz 또는 사이클당 859초에서 가장 큰 주파수 성분
a_from_fft = 0.007316664113164;
DC 성분은 데이터의 평균과 관련이 있으며, 씨 값.
사인 함수의 표준 형식이라고 부르는 Y = K*sin(A*(x -
) + C를 사용하는 것이 도움이 된다고 생각합니다.
데이터에서:
K = 값 범위의 1/2
A = 2*pi / 기간
B = 0에서 사인파의 시작점까지 오른쪽으로 이동
C = Y 값의 평균
비선형 회귀에 대한 시작 추정치는 분포 플랫폼 및 그래프 빌더에서 다음 정의를 사용하여 찾을 수 있습니다.
K = 1/2 * (최대 - 최소) = 1/2*(47 - 17.6) = 14.7
A = 2 * 3.14 / 880 = 0.007
B = 662
C = 34.1


논리니아 r 회귀 이온은 이 접근 방식을 사용하여 매우 빠르게 수렴됩니다.모델은 이 값을 사용하여 5번의 반복으로 수렴되었습니다. 아래 참조

좋아, 그게 바로 내가 부족했던 직감이다.대신 그래프가 데이터에 가깝게 보일 때까지 비선형 플랫폼에서 매개변수 값을 조작했지만 매개변수가 무엇을 나타내는지 아는 것(그리고 데이터에서 좋은 초기 추측을 얻는 것)이 훨씬 더 나은 방법입니다.
안녕하세요, 시간을 내주셔서 감사합니다. 이것은 내 응용 프로그램에 대한 훌륭한 접근 방식처럼 보입니다. 하지만- 어떻게 기간 길이를 "자동으로" 얻었습니까? 못받았어..
요아브
당신은 사용할 수 있습니다 제로 크로싱 감지기 , 데이터를 살펴보고 데이터가 음수에서 양수로 바뀔 때마다 알아차리는 작은 JSL입니다. 이것이 사인파 사이클의 시작입니다. 다음 제로 크로싱까지의 거리는 기간입니다.
여러 번 교차하는 것처럼 보이는 노이즈가 있는 데이터에 문제가 있을 수 있습니다.
제로 크로싱은 피크보다 감지하기 쉽습니다.
나는 그 아이디어를 글리치 .