Matlab - Ajuste polinómico

 
Vista:

Ajuste polinómico

Publicado por José (3 intervenciones) el 19/09/2012 20:07:58
Hola,

tengo una duda al hacer un ajuste polinómico de una serie de muestras que tengo de unas medidas en laboratorio. Usando Matlab y la herramienta Curve Fitting, soy capaz de ajustar los puntos a un polinomio y obtener la ecuación, el problema reside en que necesito un polinomio de grado específico ( A+B*x^2+C*x^-2) y la herramienta trae unos polinomios concretos.
¿Cómo puedo encontrar los coeficientes de este polinomio teniendo dos vectores x e y?

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

Ajuste polinómico

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 19/09/2012 21:55:55
¿A+B*x^2+C*x^-2? ¿Es un polinomió.?.
En que teoria te estas basando para querer ajustar con esa expresion, los vectores, x e y?.

Te recomiendo que revises la teoria de interpolacion de polinomios.



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

Ajuste polinómico

Publicado por José (3 intervenciones) el 19/09/2012 23:10:28
Estoy calculando la dispersión en un fibra óptica monomodo y después de ajustar las leyes de Maxwell se llega a esa expresión, donde x es la longitud de onda del láser con el que se transmite le pulso e y el retardo del pulso al recorrer la fibra, llevo todo el día intentando hacerlo pero no soy capaz-

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
Imágen de perfil de JOSE JOSE JEREMIAS
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Ajuste polinómico

Publicado por JOSE JOSE JEREMIAS (5917 intervenciones) el 20/09/2012 00:04:19
Lo que me parece lo que tu quieres hacer es aproximar tu funcion f(x)=A+B*x^2+C*x^-2, por medio de un polinomio, es decir quieres utilizar la teoria de interpolación de polinomios, es decir encontrar un polinomio P(x) que pase por los mismos puntos por donde pasa tu funcion f(x).
Tu objetivo debe ser hallar el polinomio P(x) que mejor ajusta a esa funcion y no hallar los coeficients f(x).


Saludos.
JOSE JEREMIAS CABALLERO
Profesor de Metodos Numéricos, Analisis Numérico, Matematica Computacional.
Asesor de Proyectos con Matlab
programador en matlab
Servicios de programacion Matlab
[email protected]

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

Ajuste polinómico

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 20/09/2012 01:23:12
No me habia leido bien tu pregunta. En tu pregunta me dices que tienes como datos a x e y.
por lo tanto es solo resolver un sistema.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
clc
clear all
% x=unique(sort(round(10*rand(1,3)+1)))
% y=round(10*rand(1,length(x)))
x=[ 3     5     9];
y=[  1    8     2];
syms A  B C
y1=A+B*x.^2+C*x.^(-2);
for i=1:length(x)
 e(i,1)=y1(i)-y(i);
 T=coeffs(e(i,1));
 R(i,:)=T(end:-1:1);
end
e
MC=double(R(1:end, 1:end-1))
I=double(R(:,end))
S=linsolve(MC,I)
A=S(1)
B=S(2)
C=S(3)


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
40
41
42
43
EJECUCION
 
e =
 
   A + 9*B + C/9 - 1
 A + 25*B + C/25 - 8
 A + 81*B + C/81 - 2
 
 
MC =
 
    1.0000    9.0000    0.1111
    1.0000   25.0000    0.0400
    1.0000   81.0000    0.0123
 
 
I =
 
    -1
    -8
    -2
 
 
S =
 
  -17.8951
    0.1752
  137.8627
 
 
A =
 
  -17.8951
 
 
B =
 
    0.1752
 
 
C =
 
  137.8627



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

Ajuste polinómico

Publicado por José (3 intervenciones) el 21/09/2012 10:34:17
Antes de nada muchas gracias por molestarse en ayudarme.
He probado el código con mis vectores y me da un "warning" y el valor de C es cero.
El título del post puede que esté mal, yo lo que quiero hacer es ajustar estas muestras a la función f(x)=A+B*x^2+C*x^-2, para luego derivarla y que me de el resultado de la dispersión en la fibra.
Me han dicho que en el programa Mathematica se puede hacer con la función "fit" pero no soy capaz.
De nuevo muchas gracias y un cordial saludo.

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
>> x=[1450 1460 1470 1480 1490 1500 1510 1520 1530 1540 1550 1560 1570 1580 1590 1600]
 
x =
 
  Columns 1 through 7
 
        1450        1460        1470        1480        1490        1500        1510
 
  Columns 8 through 14
 
        1520        1530        1540        1550        1560        1570        1580
 
  Columns 15 through 16
 
        1590        1600
 
>> y=[0.1 0.2 0.364 0.584 0.844 1.096 1.38 1.72 1.979 2.293 2.624 2.96 3.304 3.67 4.13 4.484]
 
y =
 
  Columns 1 through 9
 
    0.1000    0.2000    0.3640    0.5840    0.8440    1.0960    1.3800    1.7200    1.9790
 
  Columns 10 through 16
 
    2.2930    2.6240    2.9600    3.3040    3.6700    4.1300    4.4840
 
>> syms A B C
>> y1=A+B*x.^2+C*x.^(-2)
 
y1 =
 
[ A + 2102500*B + (4492144097854597*C)/9444732965739290427392, A + 2131600*B + (4430818617817269*C)/9444732965739290427392, A + 2160900*B + (4370740416372479*C)/9444732965739290427392, A + 2190400*B + (8623751794867869*C)/18889465931478580854784, A + 2220100*B + (8508385177009405*C)/18889465931478580854784, A + 2250000*B + (4197659095884129*C)/9444732965739290427392, A + 2280100*B + (8284490123888681*C)/18889465931478580854784, A + 2310400*B + (8175842248735535*C)/18889465931478580854784, A + 2340900*B + (1008664719310873*C)/2361183241434822606848, A + 2371600*B + (995607708481541*C)/2361183241434822606848, A + 2402500*B + (1965605195783411*C)/4722366482869645213696, A + 2433600*B + (3880971797230149*C)/9444732965739290427392, A + 2464900*B + (3831690115517583*C)/9444732965739290427392, A + 2496400*B + (7566682395240579*C)/18889465931478580854784, A + 2528100*B + (933975412932567*C)/2361183241434822606848, A + 2560000*B + (7378697629483821*C)/18889465931478580854784]
 
>> for i=1:length(x)
e(i,1)=y1(i)-y(i);
T=coeffs(e(i,1));
R(i,:)=T(end:-1:1);
end
>> e
 
e =
 
      A + 2102500*B + (4492144097854597*C)/9444732965739290427392 - 1/10
       A + 2131600*B + (4430818617817269*C)/9444732965739290427392 - 1/5
    A + 2160900*B + (4370740416372479*C)/9444732965739290427392 - 91/250
   A + 2190400*B + (8623751794867869*C)/18889465931478580854784 - 73/125
  A + 2220100*B + (8508385177009405*C)/18889465931478580854784 - 211/250
   A + 2250000*B + (4197659095884129*C)/9444732965739290427392 - 137/125
    A + 2280100*B + (8284490123888681*C)/18889465931478580854784 - 69/50
    A + 2310400*B + (8175842248735535*C)/18889465931478580854784 - 43/25
 A + 2340900*B + (1008664719310873*C)/2361183241434822606848 - 1979/1000
  A + 2371600*B + (995607708481541*C)/2361183241434822606848 - 2293/1000
   A + 2402500*B + (1965605195783411*C)/4722366482869645213696 - 328/125
     A + 2433600*B + (3880971797230149*C)/9444732965739290427392 - 74/25
   A + 2464900*B + (3831690115517583*C)/9444732965739290427392 - 413/125
  A + 2496400*B + (7566682395240579*C)/18889465931478580854784 - 367/100
    A + 2528100*B + (933975412932567*C)/2361183241434822606848 - 413/100
 A + 2560000*B + (7378697629483821*C)/18889465931478580854784 - 1121/250
 
>> MC=double(R(1:end, 1:end-1))
 
MC =
 
  1.0e+006 *
 
    0.0000    2.1025    0.0000
    0.0000    2.1316    0.0000
    0.0000    2.1609    0.0000
    0.0000    2.1904    0.0000
    0.0000    2.2201    0.0000
    0.0000    2.2500    0.0000
    0.0000    2.2801    0.0000
    0.0000    2.3104    0.0000
    0.0000    2.3409    0.0000
    0.0000    2.3716    0.0000
    0.0000    2.4025    0.0000
    0.0000    2.4336    0.0000
    0.0000    2.4649    0.0000
    0.0000    2.4964    0.0000
    0.0000    2.5281    0.0000
    0.0000    2.5600    0.0000
 
>> I=double(R(:,end))
 
I =
 
   -0.1000
   -0.2000
   -0.3640
   -0.5840
   -0.8440
   -1.0960
   -1.3800
   -1.7200
   -1.9790
   -2.2930
   -2.6240
   -2.9600
   -3.3040
   -3.6700
   -4.1300
   -4.4840
 
>> S=linsolve(MC,I)
Warning: Rank deficient, rank = 2,  tol =   3.3140e-008.
 
S =
 
   20.8467
   -0.0000
         0
 
>> A=S(1)
 
A =
 
   20.8467
 
>> B=S(2)
 
B =
 
 -9.8078e-006
 
>> C=S(3)
 
C =
 
     0
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

Ajuste polinómico

Publicado por yenny avila (1 intervención) el 06/10/2012 20:07:48
Hola Profesor José Jeremias Caballero.

Tengo una pregunta, en este momento estoy en un ajuste de unos datos experiemntales aun modelo teórico, sin embargo este modelo es valido en determinado intervalo de valores de x. Mi problema es que no encuentrola forma de restringuir los valores de x ypor ende no me ajusta como debe de ser. Que ocmando debo de utilizar a como le debo de poner al programa. mcuhas 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