Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Ajuste un modelo a datos de valor complejo

En este ejemplo se muestra cómo realizar el ajuste no lineal de datos de valor complejo. Mientras que la mayoría de los solucionadores y algoritmos de Optimization Toolbox™ operan solo en datos de valor real, solucionadores de mínimos cuadrados y pueden trabajar tanto con datos de valor real como con valores complejos para problemas sin restricciones.fsolve La función objetiva debe ser analítica en el sentido de la función compleja.

No establezca la opción cuando utilice datos complejos.FunValCheck'on' Errores del solucionador.

Modelo de datos

El modelo de datos es un exponencial simple:

el es datos de entrada, es la respuesta, y es un vector de coeficientes de valor complejo. El objetivo es estimar De y observaciones ruidosas . El modelo de datos es analítico, por lo que puede utilizarlo en una solución compleja.

Datos artificiales con ruido

Genere datos artificiales para el modelo. Tome el vector de coeficiente complejo Como.[2;3+4i;-.5+.4i] Tome las observaciones distribuidos exponencialmente. Agregue ruido de valor complejo a las respuestas .

rng default % for reproducibility N = 100; % number of observations v0 = [2;3+4i;-.5+.4i]; % coefficient vector xdata = -log(rand(N,1)); % exponentially distributed noisedata = randn(N,1).*exp((1i*randn(N,1))); % complex noise cplxydata = v0(1) + v0(2).*exp(v0(3)*xdata) + noisedata; 

Ajuste el modelo para recuperar el vector de coeficiente

La diferencia entre la respuesta pronosticada por el modelo de datos y una observación (paraxdata y respuesta paracplxydata es

objfcn = @(v)v(1)+v(2)*exp(v(3)*xdata) - cplxydata; 

Utilice uno o para ajustar el modelo a los datos.lsqnonlinlsqcurvefit Este ejemplo utiliza primero.lsqnonlin

opts = optimoptions(@lsqnonlin,'Display','off'); x0 = (1+1i)*[1;1;1]; % arbitrary initial guess [vestimated,resnorm,residuals,exitflag,output] = lsqnonlin(objfcn,x0,[],[],opts); vestimated,resnorm,exitflag,output.firstorderopt 
 vestimated =     2.1582 + 0.1351i    2.7399 + 3.8012i   -0.5338 + 0.4660i   resnorm =    100.9933   exitflag =       3   ans =      0.0018  

Recupera el vector de coeficiente complejo a aproximadamente un dígito significativo.lsqnonlin La norma del residuo es considerable, lo que indica que el ruido impide que el modelo ajuste todas las observaciones. La marca de salida es, no la preferible, porque la medida de optimalidad de primer orden se trata, no por debajo.311e-31e-6

Alternativa: Utilice lsqcurvefit

Para ajustar el uso, escriba el modelo para dar sólo las respuestas, no las respuestas menos los datos de respuesta.lsqcurvefit

objfcn = @(v,xdata)v(1)+v(2)*exp(v(3)*xdata); 

Utilice las opciones y la sintaxis.lsqcurvefit

opts = optimoptions(@lsqcurvefit,opts); % reuse the options [vestimated,resnorm] = lsqcurvefit(objfcn,x0,xdata,cplxydata,[],[],opts) 
 vestimated =     2.1582 + 0.1351i    2.7399 + 3.8012i   -0.5338 + 0.4660i   resnorm =    100.9933  

Los resultados coinciden con los de, porque los algoritmos subyacentes son idénticos.lsqnonlin Utilice cualquier solucionador que encuentre más conveniente.

Alternativa: Dividir piezas reales e imaginarias

Para incluir límites, o simplemente para permanecer completamente dentro de los valores reales, puede dividir las partes reales y complejas de los coeficientes en variables separadas. Para este problema, divida los coeficientes de la siguiente manera:

Escriba la función de respuesta para.lsqcurvefit

 function yout = cplxreal(v,xdata)  yout = zeros(length(xdata),2); % allocate yout  expcoef = exp(v(5)*xdata(:)); % magnitude coscoef = cos(v(6)*xdata(:)); % real cosine term sincoef = sin(v(6)*xdata(:)); % imaginary sin term yout(:,1) = v(1) + expcoef.*(v(3)*coscoef - v(4)*sincoef); yout(:,2) = v(2) + expcoef.*(v(4)*coscoef + v(3)*sincoef);  

Guarde este código como archivo en la ruta de acceso de MATLAB®.cplxreal.m

Divida los datos de respuesta en sus partes reales e imaginarias.

ydata2 = [real(cplxydata),imag(cplxydata)]; 

El vector de coeficiente ahora tiene seis dimensiones.v Inicializar como todos los, y resolver el problema utilizando.lsqcurvefit

x0 = ones(6,1); [vestimated,resnorm,residuals,exitflag,output] = ...     lsqcurvefit(@cplxreal,x0,xdata,ydata2); vestimated,resnorm,exitflag,output.firstorderopt 
 Local minimum possible.  lsqcurvefit stopped because the final change in the sum of squares relative to  its initial value is less than the value of the function tolerance.   vestimated =      2.1582     0.1351     2.7399     3.8012    -0.5338     0.4660   resnorm =    100.9933   exitflag =       3   ans =      0.0018  

Interprete el vector de seis elementos como un vector complejo de tres elementos y verá que la solución es prácticamente la misma que las soluciones anteriores.vestimated

Temas relacionados