저는 실험 데이터와 이론적 인 모델을 가지고 있습니다. 모델과 함께 함수 파일을 만들었습니다. 아래 코드는모델을 matlab의 데이터에 맞추기
function [ Q,P ] = RodFit(k,C)
% Function file for the theoretical scattering from a Rod
% R = radius, L = length
R = 10; % radius in Å
L = 1000; % length in Å
Q = 0.001:0.0001:0.5;
fun = @(x) ( (2.*besselj(1,Q.*R.*sin(x)))./...
(Q.*R.*sin(x)).*...
(sin(Q.*L.*cos(x)./2))./...
(Q.*L.*cos(x)./2)...
).^2.*sin(x);
P = (integral(fun,0,pi/2,'ArrayValued',true))*k+C;
end
입니다. Q는 x 값이고 P는 y 값입니다. 나는 함수를 matlab 명령 줄에서 잘 호출 할 수있다. [Q, P] = RodFit (1,0.001)은 나에게 음모를 쓸 수있는 결과를 준다. plot(Q,P)
그러나 나는 실험 데이터에 가장 잘 맞는 방법을 찾아 낼 수 없다. 이상적으로, 최적화 도구 상자와 lsqcurvefit을 사용하고 싶습니다. R과 L 매개 변수를 최적화 할 수 있기 때문입니다. 하지만 (x, y) 데이터를 lsqcurvefit에 전달하는 법을 모르겠습니다. 내가 아래 코드로 시도했지만 그것이 나에게 오류 메시지가 제공
File = 30; % the specific observation you want to fit the model to
ydata = DataFiles{1,File}.data(:,2)';
% RAdius = linspace(10,1000,length(ydata));
% LEngth = linspace(100,10000,length(ydata));
Multiplier = linspace(1e-3,1e3,length(ydata));
Constant = linspace(0,1,length(ydata));
xdata = [Multiplier; Constant]; % RAdius; LEngth;
L = lsqcurvefit(@RodFit,[1;0],xdata,ydata);
작동하지 않습니다 내가 모든 벡터를 만드는) 전을 시도
Error using *
Inner matrix dimensions must agree.
Error in RodFit (line 15)
P = (integral(fun,0,pi/2,'ArrayValued',true))*k+C;
Error in lsqcurvefit (line 199)
initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});
Caused by:
Failure in initial user-supplied objective function evaluation. LSQCURVEFIT cannot continue.
을/같은 길이 행렬 및 II) 대신 .*
을 사용해 보았습니다. 아무것도 작동하지 않고 동일한 오류 메시지가 표시됩니다.
어떤 방법을 사용해야하는지 제안하거나 내 코드 또는 제 3의 제안을 받아들이는 제안이든간에 모든 종류의 도움을 주시면 대단히 감사하겠습니다.
답변을 수정하십시오. Osmoses : 정말 좋은 지적이지만 문제는 아닌 것 같습니다. 단지 모든 벡터/행렬의 크기를 확인하고 그들은 내가 문제를 식별 한 생각
>> size(Q)
ans =
1 1780
>> size(P)
ans =
1 1780
>> size(xdata)
ans =
2 1780
>> size([1;0.001]) - the initial guess/start point for xdata (x0)
ans =
2 1
>> size(ydata)
ans =
1 1780
UPDATE
확실히해야한다. RodFit 함수는 입력을 직접 지정할 때 잘 작동합니다. [Q,P] = RodFit(1,0.001);
. 난 x0 = [1,0.001]
으로서 X0 정의하면
그러나, 동일한 난 x0 = [1,0.001]
명백히 사용하는 경우 MATLAB 만 k
입력으로 X0을 해석하고, 발생하고을 멀티 시도
>> x0 = [1;0.001]
x0 =
1.0000
0.0010
>> RodFit(x0);
Error using *
Inner matrix dimensions must agree.
Error in RodFit (line 15)
P = (integral(fun,0,pi/2,'ArrayValued',true))*k+C;
함수에 X0을 통과하지 길이 (ydata)의 벡터와 분명히 실패한 길이 (x0)의 벡터.
그래서 내 문제는 lsqcurvefit이 XDATA과 X0의 첫 번째 열은k
변수 XDATA의 두 번째 열이고 X0가
C
변수임을 이해할 수 있도록 내가 코드를 필요로한다는 것이다. 설명서에 따르면 -
Passing Matrix Arguments - 나는 x0을 행렬로 해석 자에게 전달할 수 있어야합니다. 해석기는 x0과 동일한 형식으로 xdata를 전달해야합니다.