¡Hola a todos!
La curva Y es la suma de las otras tres curvas.
La fórmula específica es: Y = Max + mid + min + 10
Si solo sé Y, necesito restaurar las tres curvas de "Max", "mid" y "min".
Lo he buscado y parece que puedo hacerlo con la transformada de Fourier.
Me gustaría preguntar si hay un módulo correspondiente con JMP para lograr esta restauración.

La fórmula de excel de las otras tres curvas es:
min=ROUND(2*SIN(80*RADIANS(:x)+RADIANS(7)),10)+2
mid=ROUND(3*SIN(21*RADIANS(:x)+RADIANS(8)),10)+3
max=ROUND(4*SIN(5*RADIANS(:x)+RADIANS(64)),10)+4
¡Gracias!
Según el análisis de Craige FFT, la curva real debe dividirse en más curvas.
No sé cómo ajustar los parámetros con el modelo FIT.
¡Gracias!

Estoy empezando a aprender en esta área. No es tan simple cambiar a datos reales:
Probé FFT, modelo FIT y series temporales.

No encendí el enfoque correcto,
Los expertos en problemas continuaron guiándome.
¡Gracias expertos!
Gracias MarkBailey!
JMP es muy poderoso y lo uso muy poco.
Puede definir un modelo paramétrico como una fórmula de columna. El modelo en este caso es la suma de tres funciones seno y una constante. Defina los parámetros en el Editor de fórmulas junto con los valores iniciales. (Tenga en cuenta que los valores iniciales son importantes, especialmente en el caso de las funciones trigonométricas). Se ve así:

La solución en la plataforma no lineal se ve así:

Adjunté la tabla de datos JMP modificada con la conversión de grados a radianes, la fórmula del modelo y el script de la tabla para iniciar Nonlinear.
Gracias markbailey!
Busco scripts y pruebo operaciones. Pero todavía no sé cómo hacerlo. Por favor, dame un ejemplo para aprender.
¡Gracias por su ayuda!
También puede usar la plataforma no lineal para ajustar un modelo personalizado que sea la suma de tres funciones trigonométricas.
Gracias por la orientación específica de Craige y la ayuda de Markbailey.
Para darme una imagen completa de cómo completar el proyecto. También prueba que JMP puede lograr esta descomposición.
Me gustaría seguir preguntándole a Craige:
Si en realidad es una serie de datos Y, tampoco se conoce su composición concreta como varias curvas.
Pero solo quiero descomponer esta Y en tres o cuatro curvas originales,
Cómo restaurar al máximo los distintos parámetros de cada curva. Y, por supuesto, sabes que DC no se puede restaurar.
¡Muchas gracias!
Vea si puede restaurar tres curvas originales y cuatro curvas.
Me pregunto si habría algún beneficio al tratar los datos como una función y los componentes del principio funcional podrían usarse para identificar la información que desea.
Ver FDE ayuda.
¿Qué esperas recuperar?
- Frecuencia/Amplitud
- Fase
- Compensación de CC
La recuperación de los tres componentes de frecuencia y amplitud (80, 21, 5 y 2, 3, 4) es fácil con la función FFT, aunque los datos del mundo real agregan complicaciones. Ver FFT y DTMF para un viejo ejemplo. Recuperar la fase parece difícil. Mi experimento a continuación se recupera (7,8,64) si la longitud del búfer coincide perfectamente con el período de la forma de onda; de lo contrario, creo que la información de fase se puede perder. (No soy un experto en este tema). Es imposible recuperar las compensaciones de CC individuales porque se suman todas.
¡Este JSL necesita muchas más pruebas antes de ponerlo en uso!
RADIANS = Function( {x}, 2 * Pi() * x / 360 );
NSAMPLES = 360; // 360 makes the answer look perfect. Real-world data will change everything for the worse...
time = NSAMPLES/360; // number of seconds the table holds
dt = New Table( "Untitled 4",
Add Rows( NSAMPLES ),// generate perfect, non-real world data
New Column( "x", formula( Row()-1 ) ), // time axis, in degrees
// not sure why you would round this to 10 places, but it was part of the question...
// adding 7 degrees is a phase adjustment, multiplying by 2 is an amplitude adjustment
// adding 2+3+4 at the end is the DC level of 9. You'll never get those individual values back, just the 9.
New Column( "min", formula( Round( 2 * Sin( 80/*Hz*/ * RADIANS( :x ) + RADIANS( 7/*degrees*/ ) ), 10 ) + 2 ) ),
New Column( "mid", formula( Round( 3 * Sin( 21/*Hz*/ * RADIANS( :x ) + RADIANS( 8/*degrees*/ ) ), 10 ) + 3 ) ),
New Column( "max", formula( Round( 4 * Sin( 5/*Hz*/ * RADIANS( :x ) + RADIANS( 64/*degrees*/ ) ), 10 ) + 4 ) ),
New Column( "combine", formula( min + mid + max ) )
);
dt << Graph Builder( Size( 1275, 240 ), Show Control Panel( 0 ), Variables( X( :x ), Y( :combine ) ), Elements( Line( X, Y, Legend( 11 ) ) ),
SendToReport( Dispatch( {}, "graph title", TextEditBox, {Set Text( "Original Data" )} ) ) );
// there are NSAMPLES and there will be NSAMPLES bins in the FFT result.
// the first half of the bins are interesting, 1..(NSAMPLES/2), the 2nd half mirror them.
// the lowest bin, 1, will represent the DC offset
// The bins 1-(NSAMPLES/2) are equal width in frequency; the maximum frequency is
// NSAMPLES/2 full cycles in a buffer (or (NSAMPLES/2) radians per buffer)
// (you know how much time a buffer represents, so you can get back to Hz)
freq = (((1 :: (NSAMPLES / 2)) - 1) / time)`; // cycles per second for each bin
{real, complex} = FFT( {dt[0, "combine"]} );
amplitude = Sqrt( real ^ 2 + complex ^ 2 );
dt2 = As Table( freq || (amplitude[1 :: (NSAMPLES / 2)]) );
dt2 << Graph Builder(
Size( 1456, 289 ),
Show Control Panel( 0 ),
Variables( X( :Col1 ), Y( :Col2 ) ),
Elements( Points( X, Y, Legend( 7 ) ) ),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( "Recovered Data" )} ),
Dispatch( {}, "X title", TextEditBox, {Set Text( "Hz" )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "Relative Amplitude" )} )
)
);
// At this point the min/mid/max are recovered. Do you need the phase too?
//
// ** I'm not confident this produces a useful answer. The answer appears
// correct for the simulated data with the perfect match to the sample
// buffer, BUT if the buffer is slightly bigger or smaller, the phases
// do not seem related to the original phases. **
//
// I *think* it is necessary to add 90 degrees below because you are using sin
// and fft uses cos. You should study that a bit more.
// I *think* the amplitude*2 vs amplitude*1 is because half of the non-DC
// samples are thrown away. You should study that a bit more too.
For( i = 1, i <= N Rows( freq ), i += 1,
amp = Round( If( i == 1, 1, 2 ) * amplitude[i] / NSAMPLES, 3 );
If( amp > .7, // this will need tweaking
Write( "\!n", freq[i], " Hz \!tAmplitude=", amp, " units \!tphase=",
90 + Round( 360 * ATan( complex[i], real[i] ) / (2 * Pi()), 3 ), " degrees"
)
);
);
Open Log( 1 );
Two graphs and some output in the log.Two graphs and some output in the log.Dos gráficos y algo de salida en el registro.
El contenedor de frecuencia cero en la FFT (elemento 1 en JSL) se llama CC porque CC significa corriente continua (a diferencia de corriente alterna, CA). Todo el aire acondicionado está en otros contenedores. La señal de CA está compensada desde cero por el nivel de CC. En el registro anterior, el contenedor de CC de 0 Hz afirma tener un ángulo de fase de 90 grados. No significa nada.
Un resultado más típico:
When the wave form's period does not match the buffer length the results are spread across many bins and the phase is probably lost.When the wave form's period does not match the buffer length the results are spread across many bins and the phase is probably lost.Cuando el período de la forma de onda no coincide con la longitud del búfer, los resultados se distribuyen en muchos contenedores y es probable que se pierda la fase.