2014-10-28 7 views
0

방정식이 F(f)=a*f^3+b*f+c입니다. 나는 데이터의 벡터를 알고있다. p, 독립 변수 'f'. a, b, c의 값을 찾아야합니다. 내가 뭘하려 :MATLAB을 사용하는 방정식에서 상수 값 찾기

function [ val ] = myfunc(par_fit,f,p) 
    % This gives me a,b,c 
    % p= af^3 +bf +c 
    val = norm(p - (par_fit(1)*(f.^3))+ (par_fit(2)*f) + (par_fit(3))); 
end 
my_par = fminsearch(@(par_fit) myfunc(par_fit,f,p),rand(1,3)); 

이 나에게 my_par = [1.9808 -2.2170 -24.8039], 또는 a=1.9808, b=-2.2170c=-24.8039을 제공하지만, 내가 b가 5보다 큰 것을 요구하고, c가 0보다 커야합니다.

val = norm(p-(par_fit(1)*f.^3+par_fit(2)*f+par_fit(3))); 

하지만 fmincon을 사용하여 최소화 할 때 변수의 값을 제한 할 수 있습니다

val = norm(p - (par_fit(1)*(f.^3))+ (par_fit(2)*f) + (par_fit(3))); 

아마해야합니다 :

+0

'c'는 0이 아니며, -24.8039입니다. 뭐가 문제 야? – David

+0

죄송합니다. 편집했습니다. C는 0보다 작거나 같을 수 없습니다. – Biparite

+0

'p - a * f^3 - b *에 대해 0을 찾고있는 것처럼'val = norm (p - par_fit (1) * f.^3 - par_fit (2) * f - par_fit (3)); f - c' – Cheery

답변

1

나는 당신의 목적 함수가 올바르지 않아 문제가있을 것 같아요 fminsearch 대신 lb 입력을 [-Inf -Inf 0]으로 설정하면 처음 두 계수는 실수가 될 수 있지만 세 번째 계수는 0보다 크거나 같아야합니다. 예 : (행렬 방법을 사용하여 음수가 아닌 제약없이) 문제를 해결하는 방법도 보여 줬습니다.)

% Sample data 
f=(0:.1:1).'; 
p=2*f.^3+3*f+1+randn(size(f)) 

% Create Van der Monde matrix 
M=[f.^3 f f.^0]; 
C=M\p; % Solve the matrix problem in a least squares sense if size(f)>size(F) 

my_par=fmincon(@(c) norm(p-(c(1)*f.^3+c(2)*f+c(3))),rand(1,3),[],[],[],[],[-Inf 5 0],[]) 
C.' 

plot(f,p,'o',f,M*C,f,my_par(1)*f.^3+my_par(2)*f+my_par(3)) 
+0

David에 대한 자세한 설명 주셔서 감사합니다. 이 경우에 b는 5보다 커야합니다. 그래서 무엇을 바꾸어야합니까? – Biparite