Combinez Integrate avec Interpolate ou SplineEval pour obtenir l'aire sous la courbe.
@sseligman écrit Utilisation de JMP pour rechercher l'aire sous une courbe ; Voici un peu plus d'informations sur certaines fonctions intégrées.
La fonction Interpoler utilise une liste triée de coordonnées X et une liste correspondante de coordonnées Y et répond à la question "si X était 42, que serait Y ?" en utilisant une interpolation linéaire entre les deux coordonnées X les plus proches dans la liste triée. L'interpolation linéaire produit des segments de droite avec des points de données sur les coins de la courbe.
La fonction SplineEval fait la même chose (avec l'aide de la fonction Spline Coef) en utilisant une interpolation spline. Une spline est un fil métallique flexible et élastique qui passe à proximité des points de données, en fonction de sa rigidité. Habituellement, les points de données ne tombent pas sur la courbe spline.
Ces deux fonctions produisent tous les points de données d'une courbe du premier X au dernier X.
La fonction Intégrer répond à une question différente : "combien d'aire se trouve sous cette courbe dans cette plage ?" Interpoler a quatre arguments ; les deux premiers décrivent une fonction af(x) qui génère une courbe et les deux derniers décrivent une plage de valeurs x. Le résultat de Integrate( f(x), x, low, high ) est l'aire sous la courbe lorsque x va de bas en haut. Les deux premières variables semblent répéter x car f(x) pourrait être une expression comme a+2*b et la deuxième variable indique si a ou b est la variable entre bas et haut.
Le JSL pour cet article concerne l'utilisation d'Interpolate ou de SplineEval comme valeur f(x) d'Interpolate.Il crée un graphique interactif pour aider à comprendre comment la recherche de l'aire sous une courbe définie par certains points de données bruités peut fonctionner avec une interpolation linéaire ou spline. Il montre également la réponse exacte (rouge) avant que le bruit (points de données noirs) ne soit ajouté aux données. La courbe bleue est l'ajustement de la spline aux points de données noirs. Le graphique à barres du milieu montre les trois calculs de surface côte à côte ; seule la barre bleue du milieu se déplace lorsque la tension de la spline change. Avec les bonnes données aléatoires, n'importe quelle barre peut être plus haute ou plus courte que les autres.
JSL makes a graph like this; the lambda slider changes the blue spline's tension.JSL crée un graphique comme celui-ci ; le curseur lambda modifie la tension de la spline bleue.
JMP 16 requis... pour chaque...
New Window( "Integrate Area Under Curve",
// make a function, in the window: namespace, that returns a sine wave
window:f = Function( {t},
50 + Sin( t / 10 ) * 40
);
// create the x dimension of the graph
window:xmin = 20; // integrate over this range
window:xmax = 80;
window:xcoarse = window:xmin :: window:xmax :: 4; // the coarse data is used to make random data from sin function
window:xfine = window:xmin :: window:xmax :: 0.125; // the fine data is used for outlining smooth polygons
// create the y dimension of the graph from x and function f(x) and some randomness
window:random = 10; // random variation, slider below
// this function called here, and from slider below
window:generatedata = Function( {}, // regenerate the points with new random error
window:ycoarse = window:f( window:xcoarse ) + J( 1, N Col( window:xcoarse ), Random Normal( 0, window:random ) );
// ycoarse is the y data for the points; limit it to stay on the y axis...
window:ycoarse[Loc( window:ycoarse > 99 )] = 99;
window:ycoarse[Loc( window:ycoarse < 1 )] = 1;
);
window:generatedata(); // prepare the initial data in the graph
// lambda is the tension on the spline interpolation, slider below
window:loglambda = 2;// spline tension, a nice middle value
// random patterns for filled areas. the exponents are artistically adjusted for blending the colors
// with gray drawn first, and dark, and yellow drawn last, medium, and blue between, but light.
// there are 7 overlaps with different shades.
window:patternsize = 299; // big square patch for a pattern
window:pat01 = J( window:patternsize, window:patternsize, (Random Integer( 0, 255 ) / 255) ^ 0.5 );//gray
window:pat02 = J( window:patternsize, window:patternsize, (Random Integer( 0, 255 ) / 255) ^ 3 );//blue
window:pat03 = J( window:patternsize, window:patternsize, (Random Integer( 0, 255 ) / 255) ^ 2 );//yellow
window:bar01 = 38;
window:bar02 = 44;// bar x-locations, in graph coordinates; they look good here, for this sine wave
window:bar03 = 50;
window:show = [1 1 1];
window:barwide = 5;
window:barbottom = 50;// bottom of chopped off bar
window:bartop = window:barbottom + 5;
// map values of the AUC onto the graph
window:aucMin = 1500;
window:aucMax = 4000;
window:aucToGraph = Function( {y}, // convert auc to graph Y to make bar heights; 0 is for a label
Interpolate( y, 0, window:barbottom - window:bartop, window:aucMin, 7, window:aucMax, 97 - window:bartop )
);
// draw a broken bar; x in graph units, y in auc units
window:drawAucBar = Function( {x, y},
y = window:aucToGraph( y );
Polygon(// ragged edge bottom poly below the break
x || x || x + .1 * window:barwide || x + .3 * window:barwide || x + .5 * window:barwide || x + .8 * window:barwide || x + window:barwide
|| x + window:barwide,
window:barbottom || window:barbottom + 5 || window:barbottom + 6 || window:barbottom + 4 || window:barbottom + 7 || window:barbottom + 3
|| window:barbottom + 5 || window:barbottom
);
If( y >= 0, // the bar is below the break, don't draw
Polygon(
x || x || x + .1 * window:barwide || x + .3 * window:barwide || x + .5 * window:barwide || x + .8 * window:barwide || x + window
:barwide || x + window:barwide,
window:bartop + y || window:bartop + 5 || window:bartop + 6 || window:bartop + 4 || window:bartop + 7 || window:bartop + 3 || window
:bartop + 5 || window:bartop + y
)
);
);
// make the GUI
window:g = Graph Box(
// this script runs when the graph needs to reshow, either the first time, or because a slider script uses <<RESHOW framesize=""></RESHOW>