2017-10-18 1 views
0

J'ai un ensemble de points de données pour lequel je voudrais tracer l'intégrale.Tracer l'aire sous la courbe (intégrale) d'un ensemble de valeurs x et y dans R

Par exemple:

x = seq(from=0, to=9, by=0.05) 
y = sin(x) 

Comment puis-je tracer l'intégrale 0-x sur l'intervalle, disons, 0-10? Où intégrale est la zone délimitée par la courbe et y=0. Cela devrait ressembler beaucoup à un graphique de 1 - cos(x), mais supposons que nous ne savons pas ce que y = f(x) est réellement.

La seule chose que je sais comment faire cela semble logique est la suivante:

spl = smooth.spline(x, y) 

Cependant je ne sais pas quoi faire. EDIT: ce n'est pas un doublon d'ombrage sous une courbe, d'une part il faut soustraire des zones sous y = 0, d'autre part il ne s'agit pas d'afficher des régions ombrées, mais de construire une fonction qui est l'intégrale. .

+0

@MaciejPitucha re: une réponse reproductible, votre souhait est ma commande. Certainement pas un doublon de cette question cependant. –

+0

Je voulais dire un exemple reproductible, désolé. –

+0

Oui, je viens d'ajouter un. –

Répondre

0

réponse de @Maciej Pitucha est bien aussi, mais je finalement embrouillé mon chemin à travers ce que je voulais d'abord faire avec smooth.spline(), et il semble fonctionner mieux pour mes données réelles.

test.x = seq(from=0, to=9, by=0.05) 
test.y = sin(x) 
spl = smooth.spline(y=test.y, x=test.x) 
f = function(x) {predict(spl, x)$y} 
f.int = function(x) {integrate(f, lower=0, upper=x)$value} 
f.int.vec = Vectorize(f.int, vectorize.args='x') 

plot(test.x, test.y, type="l", ylim = c(-1,2)) 
lines(test.x, 1-cos(test.x), col="red") 
lines(test.x, f.int.vec(test.x), col="blue") 
legend(x="bottomright", 
     col=c("black","red", "blue"), 
     legend=c("sin", "1-cos", "integral"), 
     lty=1) 

enter image description here

1

Je crois que vous voulez réaliser que:

enter image description here

S'il vous plaît noter que les lignes rouges et bleues ne sont pas identiques - qui dépend du nombre de points où vous calculez la région. Si vous augmentez le nombre 500 dans la première ligne de code, les lignes sur le tracé seront plus proches. code:

x <- seq(from=0, to=10, length.out = 500) 
n <- rep(1, length(x)) 
y <- sin(x) 

plot(x,y, type="l") 
lines(x, 1-cos(x), col="red") 
lines(x, cumsum(y*x/cumsum(n)), col="blue") 
legend(x="bottomright", 
     col=c("black","red", "blue"), 
     legend=c("sin", "1-cos", "integral"), 
     lty=1) 
+0

Merci, c'est bon. Je l'ai finalement compris en utilisant smooth.spline –