Matlab - Pintar puntos gráfica

 
Vista:

Pintar puntos gráfica

Publicado por holyo (30 intervenciones) el 01/04/2009 20:35:10
Hola a todos, tengo una función y=f(x) que pinto con el comando ezplot. ¿Cómo puedo hacer que se marquen los puntos en los que se anula "y" ?

Por ejemplo, tengo una función y=x^2-3*x+34*x-200, la pinto con ezplot(y), me gustaría que en la misma figura saliese la función pintada (en azul) y que se marcasen los puntos en los que la función se anula (y=0).

Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Pintar puntos gráfica

Publicado por Kike (304 intervenciones) el 01/04/2009 21:19:56
x = -5:0.01:5;
y = 100*sin(0.5*x)-3*x+50;

plot(x,y); % grafico la función de x
grid; % rejilla
hold on; % para que la siguiente gráfica se superponga sobre esta

ceros = [ ];
% si el signo de un elemento de y no es igual al signo del siguiente elemento
% de y es porque ha ocurrido un cruce por cero, entonces tomo ese valor de x
% y lo agrego al vector ceros
for k = 1: length(x)-1
if sign(y(k)) ~= sign(y(k+1))
ceros(end+1,1:2) = [x(k), 0];
end
end

% grafico los cruces por cero como asteriscos
plot(ceros(:,1),ceros(:,2), 'r*');
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pintar puntos gráfica

Publicado por holyo (30 intervenciones) el 01/04/2009 21:34:25
El problema es que yo no puedo utilizar el comando plot.

Mi función es muy compleja: funcion= sin(x)*cos^2-3*sin(x)^3...........
y me da error: ?? Error using ==> plot
Conversion to double from sym is not possible.

Error in ==> maximocp at 18
plot(x,funcion);

Si lo hago con el comando ezplot tampoco me deja, me sale una gráfica en la que no aparece nada, hago ezplot(x,funcion).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pintar puntos gráfica

Publicado por Kike (304 intervenciones) el 01/04/2009 22:38:20
El problema con el que me topé al usar ezplot es que debo averiguar las raíces de la ecuación, y el comado solve (el único que conozco) sólo me encuentra una raíz, que es la más cercana a cero. Por eso es que preferí usar el comando plot, pues para usarlo declaro un vector de x, y en ese rango de valores busco las raíces. Y me funciona para cualquier función, siempre y cuando se aplique en el programa anterior con la sintaxis de MATLAB respecto al operador punto:
y = sin(x).*cos(x).^2 - 3*sin(x).^3;

Pero también es posible usar a ezplot. Conociendo las raíces por el método que sea, se procedería a sobreponerlas sobre la gráfica de ezplot. En otras palabras el problema real no es graficar, sino encontrar las raíces de la ecuación.

Pero si te sirve de algo, este programa encuentra tres raíces:

syms x

ezplot('sin(x)*cos(x)^2-3*sin(x)^3');

raices = solve('sin(x)*cos(x)^2-3*sin(x)^3');

grid;
hold on;
Raices = double(raices); % convierto de simbólico a real
plot(Raices,zeros(1,length(Raices)),'r*');
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pintar puntos gráfica

Publicado por holyo (30 intervenciones) el 01/04/2009 22:00:24
El problema es que yo no puedo utilizar el comando plot.

Mi función es muy compleja: funcion= sin(x)*cos^2-3*sin(x)^3...........
y me da error: ?? Error using ==> plot
Conversion to double from sym is not possible.

Error in ==> maximocp at 18
plot(x,funcion);

Si lo hago con el comando ezplot tampoco me deja, me sale una gráfica en la que no aparece nada, hago ezplot(x,funcion).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pintar puntos gráfica

Publicado por ramiro (54 intervenciones) el 04/04/2009 06:14:28
Lo que pasa es que hay que escribir las funciones según la sintaxis de matlab, al principio es un poco latoso acostumbrarse, pero una vez agarrandole la onda se vuelve familiar.
Prueba escribiendo tu función en la forma:
funcion= sin(x).*cos(x).^2-3*sin(x).^3...........
Nota el punto que debe llevar la variable cuando la elevas a cualquier exponente
x.^2 y también cuando multiplicas dos variables x .*y
También te comento que el comando ezplot se usa principalmente cuando la funación es implícita, es decir, cuando no aparece despejada la y en f(x,y)=0.
Después de eso sigue las indicaciones de Kiki y debes llegar al resultado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pintar puntos gráfica

Publicado por holyo (30 intervenciones) el 07/04/2009 13:03:53
Hola, pues sigue sin salirme bien. Hice esto

x = -5:0.01:5;
y=(-73789551968678135147/18446744073709551616*sin(x).*cos(x)+

+3184553626372111/2251799813685248*cos(x)-9553827621954309

/1125899906842624*sin(x).^2.*cos(x)-3642552876542349

/147573952589676412928*sin(x)-3642616451083229

/36893488147419103232*sin(x).*cos(x).^2+3642616451083229

/73786976294838206464*sin(x).^3)*(295153056482079092647

/295147905179352825856+3184553626372111

/2251799813685248*cos(x)+3642552876542349

/147573952589676412928*sin(x))-(295153056482079092647

/295147905179352825856-73789551968678135147

/36893488147419103232*sin(x).^2+3184553626372111

/2251799813685248*sin(x)-3184609207318103

/1125899906842624*sin(x).^3+3642552876542349

/147573952589676412928*cos(x)-3642616451083229

/73786976294838206464*sin(x).^2.*cos(x))*(-3184553626372111

/2251799813685248*sin(x)+3642552876542349/147573952589676412928*cos(x));

plot(x,y);

title('Función derivada de Cp')
grid on;
hold on;
ceros=[];
for k = 1: length(x)-1
if sign(y(k)) ~= sign(y(k+1))
ceros(end+1,1:2) = [x(k), 0];
end
end
plot(ceros(:,1),ceros(:,2), 'r*');

Me sale este error:

??? Error using ==> mtimes
Inner matrix dimensions must agree.

Error in ==> maximocp at 29
y=(-73789551968678135147/18446744073709551616*sin(x).*cos(x)+3184553626372111/2251799813685248*cos(x)-9553827621954309/1125899906842624*sin(x).^2.*cos(x)-3642552876542349/147573952589676412928*sin(x
>>

Miré y remiré si tenía la función bien escrita pero no encontré nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pintar puntos gráfica

Publicado por Kike (304 intervenciones) el 07/04/2009 16:02:15
El error al que se refiere MATLAB es acerca de la sintaxis del operador punto.
Es un error como este:
(sin(x)+2)*(sin(x)-1) (sin punto antes del asterisco)

Mi sugerencia es usar decimales en lugar de fracciones, ya que así se reduce considerablemente el tamaño de la ecuación y se hace más fácil detectar errores, aunque usar decimales reduce un poco la precisión (no mucho).

La gráfica resultante tiene 6 raíces en el rango de x=-5 a x=5:
x = -3.95
x = -1.84
x = -0.79
x = 0.26
x = 2.34
x = 4.45



x = -5:0.01:5;

y=(-4.0001*sin(x).*cos(x)+...
+1.4142*cos(x) - 8.4855*sin(x).^2.*cos(x)-...
2.4683e-5*sin(x)-...
9.8733e-5*sin(x).*cos(x).^2+...
4.9367e-5*sin(x).^3).*(1 + 1.4142*cos(x)+... % un error
2.4683e-5*sin(x))-...
(1 - 2.0001*sin(x).^2+...
1.4142*sin(x)-...
2.8285*sin(x).^3+...
2.4683e-5*cos(x)-...
4.9367e-5*sin(x).^2.*cos(x)).*(-1.4142*sin(x)+... % otro error
2.4683e-5*cos(x));

plot(x,y); % grafico la función de x
grid; % rejilla
hold on; % para que la siguiente gráfica se superponga sobre esta

ceros = [ ];
% si el signo de un elemento de y no es igual al signo del siguiente elemento
% de y es porque ha ocurrido un cruce por cero, entonces tomo ese valor de x
% y lo agrego al vector ceros
for k = 1: length(x)-1
if sign(y(k)) ~= sign(y(k+1))
ceros(end+1,1:2) = [x(k), 0];
end
end

% grafico los cruces por cero como asteriscos
plot(ceros(:,1),ceros(:,2), 'r*');
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pintar puntos gráfica

Publicado por holyo (30 intervenciones) el 07/04/2009 17:59:10
Hola otra vez, pues si, tenías razón, se me había olvidado un punto en la multiplicación de dos paréntesis.

Todo solucionado, muchas muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pintar puntos gráfica

Publicado por Kike (304 intervenciones) el 08/04/2009 16:08:12
¡Ojo! Viendo la gráfica noté que hay dos ceros como puntos de inflexión cuando x es casi -2.5 y cuando x es casi 4. En estos casos la raíz de la función no se da en un cruce por cero.

Para solucionarlo se me ocurre comparar el valor de la función con un valor cercano a cero como 0.0001 (no será exactamente cero por haber hecho aproximanciones). Compararía este valor de y(x) con el elemento anterior y con el siguiente, de manera que si el anterior y el siguiente son mayores es porque dicho elemento es un punto de inflexión.


x = -5:0.01:5;
%y = sin(x).*cos(x).^2-3*sin(x).^3;

y=(-4.0001*sin(x).*cos(x)+...
+1.4142*cos(x) - 8.4855*sin(x).^2.*cos(x)-...
2.4683e-5*sin(x)-...
9.8733e-5*sin(x).*cos(x).^2+...
4.9367e-5*sin(x).^3).*(1 + 1.4142*cos(x)+...
2.4683e-5*sin(x))-...
(1 - 2.0001*sin(x).^2+...
1.4142*sin(x)-...
2.8285*sin(x).^3+...
2.4683e-5*cos(x)-...
4.9367e-5*sin(x).^2.*cos(x)).*(-1.4142*sin(x)+...
2.4683e-5*cos(x));

plot(x,y); % grafico la función de x
grid; % rejilla
hold on; % para que la siguiente gráfica se superponga sobre esta

ceros = [ ];
% si el signo de un elemento de y no es igual al signo del siguiente elemento
% de y es porque ha ocurrido un cruce por cero, entonces tomo ese valor de x
% y lo agrego al vector ceros
for k = 2: length(x)-1
if (sign(y(k)) ~= sign(y(k+1))) || (y(k-1)>y(k) && y(k)<y(k+1) && abs(y(k))<=0.0001)
ceros(end+1,1:2) = [x(k), 0];
end
end

% grafico los cruces por cero como asteriscos
plot(ceros(:,1),ceros(:,2), 'r*');
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar