Как использовать lsqcurvefit для рациональной функции? - PullRequest
0 голосов
/ 13 июня 2018

Я хочу подобрать рациональную функцию, используя технику подбора кривой в 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?

1 Ответ

0 голосов
/ 13 июня 2018

Переменная 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)
...