Matlab - Duda spline

 
Vista:

Duda spline

Publicado por Aless (10 intervenciones) el 01/05/2012 19:43:45
Hola, estoy haciendo un .m para obtener y dibujar las splines. Primero introduces los puntos (x,y) que tu quieres.

El siguiente código te permite obtener los coeficientes para cada spline:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
%Primero hay que introducir el vecto X e Y
N=length(X)-1;
H=diff(X);
E=diff(Y)./H;
diagsupinf=H(2:N-1);
diagprinc=2*(H(1:N-1)+H(2:N));
U=6*diff(E);
% restricciones del spline natural
Minicial=0; Mfinal=0;
% construccion de la matriz de los coeficientes para el calculo de los
% momentos
A=diag(diagprinc)+diag(diagsupinf,1)+diag(diagsupinf,-1);
% construccion del vector independiente para el calculo de los momentos
B=U'; B(1)=B(1)-H(1)*Minicial; B(N-1)=B(N-1)-H(N)*Mfinal;
% resolvemos el sistema y hallamos los momentos
M=A\B;
% a~nadimos los dos momentos naturales extremos y lo escribimos como vector
% fila
M=[Minicial,M',Mfinal];
% calculo de los coeficientes del polinomio cubico i-esimo en potencias
% de (x-x_i)
for i=1:N
S(i,1)=(M(i+1)-M(i))/(6*H(i));
S(i,2)=M(i)/2;
S(i,3)=E(i)-H(i)*(M(i+1)+2*M(i))/6;
S(i,4)=Y(i);
end


De esta manera, se obtiene S=

[ A1 B1 C1 D1; A2 B2 C2 D2;............; AN BN CN DN]

El problema, es que aún teniendo esta matriz, no sé cómo hacer para representar las funciones spline (correspondiente a cada intervalo).

¿Alguien me puede echar una mano? Se lo agradecería mucho.
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
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Duda spline

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 02/05/2012 06:26:09
Hola Aless
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
clear all
X=[40	45	50	55	60	65	70];
Y=[390	340	290	250	210	180	160];
N=length(X)-1;
H=diff(X);
E=diff(Y)./H;
diagsupinf=H(2:N-1);
diagprinc=2*(H(1:N-1)+H(2:N));
U=6*diff(E);
% restricciones del spline natural
Minicial=0; Mfinal=0;
% construccion de la matriz de los coeficientes para el calculo de los
% momentos
A=diag(diagprinc)+diag(diagsupinf,1)+diag(diagsupinf,-1);
% construccion del vector independiente para el calculo de los momentos
B=U'; B(1)=B(1)-H(1)*Minicial; B(N-1)=B(N-1)-H(N)*Mfinal;
% resolvemos el sistema y hallamos los momentos
M=A\B;
% a~nadimos los dos momentos naturales extremos y lo escribimos como vector
% fila
M=[Minicial,M',Mfinal];
% calculo de los coeficientes del polinomio cubico i-esimo en potencias
% de (x-x_i)
for i=1:N
S(i,1)=(M(i+1)-M(i))/(6*H(i));
S(i,2)=M(i)/2;
S(i,3)=E(i)-H(i)*(M(i+1)+2*M(i))/6;
S(i,4)=Y(i);
end
 
syms x
for i=1:N
    s=0;
    for j=1:size(S,2)
        s=s+expand(S(i,j)*(x-X(j))^(4-j));
    end
    Es(i,:)=s;
end
display(Es)


1
2
3
4
5
6
7
8
9
10
11
EJECUCION
>> splines_cubicos1
 
Es =
 
    - (59*x^3)/9750 + (236*x^2)/325 - (15169*x)/390 + 49519/39
     (59*x^3)/1950 - (2419*x^2)/650 + (27904*x)/195 - 98677/78
   - (341*x^3)/9750 + (114*x^2)/25 - (81703*x)/390 + 144715/39
   (289*x^3)/9750 - (2417*x^2)/650 + (29032*x)/195 - 123043/78
       - (7*x^3)/1950 + (232*x^2)/325 - (1501*x)/30 + 53791/39
 - (149*x^3)/9750 + (1341*x^2)/650 - (19256*x)/195 + 145115/78



Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
programador en matlab
Servicios de programacion matlab
[email protected]

http://matlabcaballero.blogspot.com
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

Duda spline

Publicado por Aless (10 intervenciones) el 02/05/2012 21:44:03
Muchísimas gracias Jose Jeremías, ahora obteniendo las funciones me gustaría pintarlas. No sé si me explico bien.

Me gustaría visualizar los puntos (cómo lo que has tomado) y visualizar la spline que une cada uno.

He intentado hacer algo, pero me sale error, mi idea es hacer un bucle for que recorra cada intervalo con cada función, y en cada ciclo que dibuje la gráfica y mantener con un hold. ¿Sería correcto o lo estoy enredando mucho?

Un saludo y 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

Duda spline

Publicado por Aless (10 intervenciones) el 05/05/2012 00:18:15
Hola señor Jose Jeremías, para hacer lo que he comentado anteriormente, ¿podría utilizar el comando ppval?

Un saludo y gracias por su tiempo.
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

Duda spline

Publicado por Aless (10 intervenciones) el 06/05/2012 13:50:05
Gracias Jose Jeremías por la ayuda con el comando inline. Sin embargo, me da mucha vergüenza reconocer, que después de bastante tiempo investigando el comando a través de internet y con la ayuda de matlab, no he podido saber cómo utilizarlo para lo que yo quiero hacer.

Quizás no expliqué bien lo que me queda por hacer. En un post anterior (has escrito el código y todo, te lo agradezco), al final conseguimos la matriz Es que está formada por funciones, cada una pertenece a un intervalo distinto.

Es(1)--->f1---> Intervalo X [40,45)
Es(2)--->f2---> Intervalo X [45,50)
Es(3)--->f3---> Intervalo X [50,55)
Es(4)--->f4---> Intervalo X [55,60)
Es(5)--->f5---> Intervalo X [60,65)
Es(6)--->f6---> Intervalo X [65,70)

Ahora lo que quiero hacer (por eso he preguntado por el comando ppval e inline), es a partir de esa matriz (con sus funciones) y conociendo los intervalos en los que tienen vigencia, construir la gráfica.

No hace falta que me de la respuesta completa, si me puede dar otra pequeña pista, se lo agradecería enormemente. No quiero que usted pierda tiempo.
Muchas gracias, que siempre está ahí para resolver todas las dudas.
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