Matlab - problema con las limitaciones de cftool

 
Vista:

problema con las limitaciones de cftool

Publicado por Vicente (7 intervenciones) el 25/03/2010 18:01:27
Hola a todos,

Ando detras de realizar un ajuste utilizando Matlab con la ayuda del entorno CFTOOL. Mis datos experimentales deben de ajustarse a una ecuación del tipo:

Y=C1+C2*X+C3*log(1-(X/Z))

donde C1,C2 y C3 son los coeficientes que deseo calcular, Y es la variable dependiente y (X,Z) son variables independientes con Y pero dependientes entre si, es decir para cada valor de X tengo un valor de Z asociado. En otras palabras tengo tres vectores conocidos Y,X,Z, donde cada elemento i de estos vectores me defiene una ecuación del tipo:

Yi=C1+C2*Xi+C3*log(1-(Xi/Zi))

para los n puntos experimentales que tengo.

MI PROBLEMA
No encuentro el modo de incorporar el vector Z en la ecuación primera que os muestro. La pestaña de custom equation no me permite (o no se como hacerlo) incorporar el vector z.

Alguna idea?

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:problema con las limitaciones de cftool

Publicado por Jorge (226 intervenciones) el 26/03/2010 00:43:44
Hola Vicente,

¿Podrías mostrar los datos experimentales?
Quisiera explorarlos un poco antes de darte mi opinión.

Saludos,
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:problema con las limitaciones de cftool

Publicado por Jorge (226 intervenciones) el 27/03/2010 08:33:23
Bueno, aquí va mi opinión.

El problema yo lo resolvería como un problema de optimización de sistemas no lineales, empleando la función fminsearch.

Esta función encuentra el valor de las variables que minimizan alguna otra función propuesta. Entonces el problema se reduce a expresar lo que necesitas de alguna manera que pueda ser minimizada.

fminsearch encuentra mínimos locales, no globales.

Suponiendo que tus puntos experimentales fueran estos, entre otros:

x1 = 3; z1 = 27; y1 = 11.42;
x2= -3; z2 = -27; y2 = -7.78;
x3= 13.4; z3 = 2.4e3; y3 = 47.7;

se podría formular una función objetivo que, junto con fminsearch, encuentre los coeficientes que buscas.

Por ejemplo, así minimizas el error que hay entre las diferentes funciones, de tal manera que la solución arroja los coeficientes que satisfacen al sistema simultáneamente:

%%%%%%%%%

function f = nonlin_syst(C)

x = 3; z = 27; y = 11.42;
f1 = C(1) + C(2)*x + C(3)*log(1 - (x/z)) - y;

x = -3; z = -27; y = -7.78;
f2 = C(1) + C(2)*x + C(3)*log(1 - (x/z)) - y;

x = 13.4; z = 2.4e3; y = 47.7;
f3 = C(1) + C(2)*x + C(3)*log(1 - (x/z)) - y;

e1 = abs(f3 - f2);
e2 = abs(f3 - f1);
e3 = abs(f2 - f1);

f = max([e1 e2 e3]);

%%%%%%%%%%%%

Luego, desde otro script, podrías llamar la función de esta manera:

%%%%%%%%%%%%

fx = 'nonlin_syst';
C0 = [4 2 20]
[C, f, EF, out] = fminsearch(fx, C0)

%%%%%%%%%%%

C0 es el punto de arranque y hay diferentes soluciones para diferentes arranques.
Se espera que f sea lo más cercano posible a 0.

Naturalmente hay muchas maneras de formular el problema, y quizá estoy sobresimplificando.

En este caso, la solución es:

C = 3.0393 3.2000 26.7417
f = 1.6472e-006

Y puedes probar las funciones con estos coeficientes:
f1 = -1.9304
f2 = -1.9304
f3 = -1.9304

Saludos. Ojalá te sea de utilidad.
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:problema con las limitaciones de cftool

Publicado por Vicente (7 intervenciones) el 27/03/2010 13:19:22
Hola Jorge,

Perdona por el retarso en contestarte y en ante todo muchas gracias por tu respuesta. La causa de mi retraso se debe a que estaba comentiendo un ligero error en la ecuación de partida. Subsanado ese error la ecuación de partida queda del sigiente modo:

y=C(1)+C(2)x+C(3)log(1-(z/4,99)

(*) Contestando a tu primer post te paso unos 10 puntos experimentales con los que trabajo:

y x z
0,2158 4,913 4,81
0,2850 4,889 4,76
0,3486 4,829 4,67
0,4071 4,432 4,24
0,4561 3,508 3,3
0,4910 2,453 2,23
0,5140 1,577 1,34
0,5278 0,986 0,74
0,5365 0,595 0,35
0,5378 0,509 0,26

y = C(1) + C(2)*x + C(3)*log(1 - (z/4,99))

Naturalmente incorporar el vector z es impescindible para que el argumento del la función neperiano no tome valores negativos que abortarian el proceso de fitting.

(*) Contestando tu segundo post decirte que efectivamente el metodo que propones es factible, en definitiva el problema se reduce a resolver un sistema de 3 ecuaciones con 3 incognitas (los coeficientes C1,C2 y C3) para los n puntos que tengo y luego hacer la media para cada uno de los coeficienes obtenidos. Creo entender que así planteas el problema.
Es mas, creo que un fit por minimos cuadrados es factible de ser realizado, esto es, consitiría en resolver un sistema de 3 ecuciones de 3 incognitas para los n puntos del siguiente estilo:

i*C(1) + C(2)*xi + C(3)*log(1-(zi/4,99))= yi

C(1)*xi + C(2)*xi^2 + C(3) *log(1-(zi/4,99)*xi = yi*xi

C(1)*log(1-(zi/4,99)) + C(2)*xi*log(1-(zi/4,99)) + C(3)*(log(1-(zi/4,99))^2 = yi * log(1-(zi/4,99)

donde i=1,2,...,n siendo n los n puntos experimentales obteniendose de este modo n sistemas de ecuaciones de 3 ecuaciones y 3 incognitas

El caso es que no tengo muy clara la base matematica que me permite postular que el ajuste por minimos cuadrados (least-squares) es el adecuado o en su defecto se debe realizar un non-linear least-squares (Newton method or Levenberg parameter). Intuyo que la respuesta lineal con respecto a x de la ecuación de partida me permite utilizar el metodo por minimos cuadrados. En su defecto, para la variante de la ecuacion de partida que escribo a continuación:

y = C(1) + C(2)*x + C(3)*log(1 - (x/C4))

La regresion por minimos cudrados no sería posible. Corrigeme en caso de que no esté en lo cierto.

Un saludo y gracias por tu detallada y justificada respuesta.
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:problema con las limitaciones de cftool

Publicado por Jorge (226 intervenciones) el 28/03/2010 10:15:55
Hola Vicente,

Ya exploré tus datos.
Efectivamente, hay muchas maneras de resolver el ajuste de curvas. Sin embargo, me parece que implementar el método que mencionas es muy complicado. Seguramente lo lograrías, pero a costa de mucho tiempo trabajando en ese algoritmo.

Los problemas de ajuste de curvas que yo he enfrentado son más bien prácticos y menos teóricos.

La función fminsearch emplea el método de Nelder-Mead (simplex).
La función lsqnonlin resuelve problemas no lineales de mínimos cuadrados, incluyendo ajustes no lineales.

Hay muchas otras funciones que están en la toolbox de optimización. A mí me gusta utilizar fminsearch porque es una instrucción estándar y no requiere de toolboxes especiales, aunque tampoco es la función más eficiente.

Así definí la función objetivo:

%%%%%%%%%%%%%%%%%%%%%%%%%%
function f = OF_caso(C)
global y x z

y2 = (C(1) + C(2)*x + C(3)*log(1 - (z/4.99)));
f = norm(y - y2, 1);
%%%%%%%%%%%%%%%%%%%%%%%%%%

Así preparé la función que la llama:

%%%%%%%%%%%%%%%%%%%%%%%%%%
clear; clc; format compact; close all
global y x z

data = [0.2158 4.913 4.81
0.2850 4.889 4.76
0.3486 4.829 4.67
0.4071 4.432 4.24
0.4561 3.508 3.3
0.4910 2.453 2.23
0.5140 1.577 1.34
0.5278 0.986 0.74
0.5365 0.595 0.35
0.5378 0.509 0.26];

y = data(:, 1);
x = data(:, 2);
z = data(:, 3);

fx = 'OF_caso';
C0 = [1 1 1]
[C, f, EF, out] = fminsearch(fx, C0)

plot(x,y)
hold on

y2 = (C(1) + C(2)*x + C(3)*log(1 - (z/4.99)));
plot(x,y2,'r')
%%%%%%%%%%%%%%%%%%%%%%%%%%

El resultado fue:
C = 0.5383 0.0039 0.0885

Saludos. Ojalá te sirva.
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:problema con las limitaciones de cftool

Publicado por Vicente  (7 intervenciones) el 28/03/2010 12:27:15
Hola Jorge.

Gracias una vez mas por tus justificadas respuestas. Los coeficientes obtenidos cuadran en buena medida con los resultados de otros autores luego el método que planteas funciona.

El fitting que he comentado en este post es solo una pequeña parte de la investigación que desarrollo. He llegado a un punto donde tener pericia con matlab es imprescindible para dar el siguiente paso. Tengo un puñado de datos que tengo que exprimir y tus indicaciones pueden ser muy útiles para optimizar mi tiempo. Naturalmente estoy hablando de una asesoría non-free. Mandame un email si estas interesado.

Gracias una vez mas.
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