我想在MATLAB中使用曲线拟合技术拟合一个有理函数。
我正在尝试使用lsqcurvefit
来重现一个有理函数M
,该函数需要5个输入,其中数据来自精确函数C
。我想我已经接近了这块情节;但是,当我使用lsqcurvefit
时,我不断收到错误消息:
LSQCURVEFIT要求以下输入为数据类型double:' YDATA'。
以下是我的代码:
% Define range for k
k= linspace(1E-10,1.5,100);
% Exact Function C(k)
C= @(k)(0.5*((1i*k+0.135).* (1i*k+0.651)))./((1i*k+0.0965).* (1i*k+0.4555));
% Cget function used to extract real and imaginary numbers and stacks the result
Cget= @(k)[real(C(k)); imag(C(k))];
%Call function Cget(k) to get stacked real and imaginary values
realimag =Cget(k);
% Create an initial guess
x0=[1,1];
% Define parameters
a1=0.2; a2=0.7; b1=0.1; b2=0.5;
% Define approximated function
M= @(a1,a2,b1,b2,k)(0.5*((1i*k+a1).* (1i*k+a2)))./((1i*k+b1).* (1i*k+b2));
Mget1= @(a1,a2,b1,b2,k)[real(M(a1,a2,b1,b2,k)); imag(M(a1,a2,b1,b2,k))];
T=Mget1(a1,a2,b1,b2,k);
%Find best fit curve
x=lsqcurvefit(M,x0,k,C)
如果确切的函数M
?
C
答案 0 :(得分:1)
变量C
应作为双数组输入,以便函数获取输入范围并在计算中使用它。
% Exact Function C(k)- Bessel Function
C0 = (0.5*((1i*k+0.135).* (1i*k+0.651)))./((1i*k+0.0965).* (1i*k+0.4555));
和x
的参数可以输入为具有4个值的数组。
M = @(x,k)(0.5*((1i*k+x(1)).* (1i*k+x(2))))./((1i*k+x(3)).* (1i*k+x(4)));
和x0
应该有4个值。
x0 = [1,1,1,1];
%Find best fit curve
x = lsqcurvefit(M,x0,k,C0)