Bonjour à tous!
La courbe Y est la somme des trois autres courbes.
La formule spécifique est : Y = Max + mid + min + 10
Si seulement connaître Y, j'ai besoin de restaurer les trois courbes de "Max", "mid" et "min".
J'ai cherché et il semble que je peux le faire avec la transformée de Fourier.
Je voudrais demander s'il existe un module correspondant avec JMP pour réaliser cette restauration.

La formule excel des trois autres courbes est :
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
Merci!
Selon l'analyse Craige FFT, la courbe réelle devrait être divisée en plusieurs courbes.
Je ne sais pas comment régler les paramètres avec le modèle FIT.
Merci!

Je commence tout juste à apprendre dans ce domaine. Ce n'est pas si simple de passer aux données réelles :
J'ai essayé FFT, le modèle FIT et les séries chronologiques.

Je n'ai pas choisi la bonne approche,
Les experts en difficulté ont continué à me guider.
Merci Experts !
Vous pouvez définir un modèle paramétrique en tant que formule de colonne. Le modèle dans ce cas est la somme de trois fonctions sinusoïdales et d'une constante. Vous définissez les paramètres dans l'éditeur de formule avec les valeurs de départ. (Notez que les valeurs de départ sont importantes, en particulier dans le cas des fonctions trigonométriques.) Cela ressemble à ceci :

La solution dans la plate-forme non linéaire ressemble à ceci :

J'ai joint la table de données JMP modifiée avec la conversion de degrés en radians, la formule du modèle et le script de table pour lancer Nonlinear.
Merci Mark Bailey !
Je recherche des scripts et j'essaie des opérations.Mais je ne sais toujours pas comment le faire.Veuillez me donner un exemple pour apprendre.
Merci pour votre aide!
Vous pouvez également utiliser la plate-forme non linéaire pour ajuster un modèle personnalisé qui est la somme de trois fonctions trigonométriques.
Merci pour les conseils spécifiques de Craige et l'aide de Markbailey.
Pour me donner une image complète de la façon de mener à bien le projet. Cela prouve également que JMP peut accomplir cette décomposition.
J'aimerais continuer à demander à Craige :
S'il s'agit en réalité d'une série de données Y, on ne connaît pas non plus sa composition concrète sous forme de plusieurs courbes.
Mais je veux juste décomposer ce Y en trois ou quatre courbes originales,
Comment restaurer au mieux les différents paramètres de chaque courbe. Et, bien sûr, vous savez que le DC ne peut pas être restauré.
Merci beaucoup!
Voyez si vous pouvez restaurer trois courbes d'origine et quatre courbes.
Je me demande s'il y aurait un avantage à traiter les données comme une fonction et les composants du principe fonctionnel pourraient être utilisés pour identifier les informations que vous souhaitez.
Voir FDE aider.
Qu'espérez-vous récupérer ?
- Fréquence/Amplitude
- Phase
- Décalage CC
La récupération des trois composantes de fréquence et d'amplitude (80, 21, 5 et 2, 3, 4) est facile avec la fonction FFT, bien que les données du monde réel ajoutent des complications. Voir FFT et DTMF pour un vieil exemple. Récupérer la phase semble difficile. Mon expérience ci-dessous récupère (7,8,64) si la longueur du tampon correspond parfaitement à la période de la forme d'onde, sinon je pense que les informations de phase peuvent être perdues. (Je ne suis pas un expert sur ce sujet.) La récupération des décalages DC individuels est impossible car ils sont tous additionnés.
Ce JSL a besoin de beaucoup plus de tests avant de l'utiliser !
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.Deux graphiques et quelques sorties dans le journal.
Le bac de fréquence zéro dans la FFT (élément 1 dans JSL) est appelé DC car DC signifie courant continu (par opposition à courant alternatif, AC). Tout le courant alternatif est dans d'autres bacs. Le signal AC est décalé de zéro par le niveau DC. Dans le journal ci-dessus, le bac CC 0 Hz prétend avoir un angle de phase de 90 degrés. Cela ne veut rien dire.
Un résultat plus typique :
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.Lorsque la période de la forme d'onde ne correspond pas à la longueur de la mémoire tampon, les résultats sont répartis sur plusieurs cases et la phase est probablement perdue.