2013-10-01 2 views
2

저는 실험 데이터와 이론적 인 모델을 가지고 있습니다. 모델과 함께 함수 파일을 만들었습니다. 아래 코드는모델을 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를 전달해야합니다.

답변

0

입력 데이터의 방향 (예 : xdata & ydata가 행/열 벡터 인 경우)을 시도해 보셨습니까 (실수 일 수 있음). 그 외에는 코드가 제대로 작동하는 것처럼 보입니다.

0

나는 몇 가지 문제를 해결할 수있었습니다. 내 코드에서 한 가지 실수는 목적 함수가 벡터 변수를 사용하지 않고 두 개의 변수 (k와 C)를 대신 사용한다는 것입니다.이 문제는 상기 코드 벡터를 받아들이

function [ Q,P ] = RodFit(X) 
% Function file for the theoretical scattering from a Rod 
% R = radius, L = length 

% Q = 0.001:0.0001:0.5; 
Q = linspace(0.11198,4.46904,1780); 
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))*X(1)+X(2); 

코드를 해결 변경 전 x0 = [1 0.001]; X0로 정의하고 RodFit로 그것을 전달하고 결과를 얻을 수있다. 또한 함수에 xdata를 전달하여 결과를 얻을 수 있습니다. 그들은 지금 행 벡터와 XDATA의 크기가 너무 size(xdata) = 1780 2

내가 문제를 완전히 해결했다고 생각하지만 난 lsqcurvefit을 실행할 때 난 여전히 문제로 실행에게이되도록 [Q,P] = RodFit(xdata(2,:));

공지 사항 난 모든 벡터의 방향을 변경 한 . 난 아무 생각이 오류 메시지

Error using RodFit 
Too many input arguments. 

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. 

을받을 이유 - 사람이 내가 lsqcurvefit를 호출 할 때하지만 난 XDATA를 사용하여 함수 설명서를 실행할 때 Rodfit 많은 입력 인수에 접수에 이유에 대해 어떤 생각을 가지고 있습니까?

관련 문제