2015-10-13 8 views
1

У меня есть участок с двумя пересекающимися параболами. Есть ли способ, чтобы я мог правильно определить два и установить две параболы, по одной на каждую из них? Мой текущий код подходит только один параболу:Установка кривой с использованием matlab

x=-100:1:100; 
y=(x.^2)/(4); 
x1=-50:1:150; 
y1=(x.^2)/(4); 
x=[x,x1]; 
y=[y,y1]; 
f = fittype('((x)*(x))/4*p',... 
'dependent',{'y'},'independent',{'x'},... 
'coefficients',{'p'}) 
fit1= fit(x',y',f) 
plot(fit1,x,y) 

enter image description here

+1

кривые настолько регулярны, что один чудеса если вы не можете заранее сказать, к какой параболе принадлежат точки, или даже если вам нужно вписаться в параболы вообще ... –

+1

Я думаю, что вы хотите сначала найти два минимума/локальные минимумы парабол, а затем пересечение двух парабол, и используйте только по одной части параболы, а не всего. Это не должно быть сложной проблемой. – GameOfThrows

+1

, чтобы улучшить комментарий @GameOfThrows. Я предлагаю начать с локальных минимумов, проверяя ближайшие точки и сортируя их по двум массивам. Единственная проблема будет в перехватах, но мы также можем проверить производные, которые должны медленно меняться. –

ответ

0

Ниже предложения я был в состоянии написать код, который работает RANSAC для кривых

function [f1] = Ransac(x,y) 
voting=[0,0,0,0]; 
for i=1:10000 

[y1,idx] = datasample(y,5); 
x1=x(idx); 
p = polyfit(x1,y1,2); 
f1 = polyval(p,x); 
error=(((f1-y).^2)); 
error(error>100)=0; 
indx =find(ismember(voting(:,1:3),'rows'),1); 
if (isempty(indx)==1) 
    voting=[voting;[p,sum(error)]]; 
else 
    voting(indx,4) = voting(indx,4)+sum(error); 
end 
end 
[s,t]=max(voting(:,4)); 
p=voting(t,1:3); 
f1 = polyval(p,x); 
end 
Смежные вопросы