# How to segment a curve into linear and nonlinear pieces

조회 수: 6 (최근 30일)
Ahmed Zohaib . 2023년 7월 19일
댓글: Bruno Luong . 2023년 7월 19일
I have a dataset which looks linear at the beginning (up to ~3.5 along x-axis) and then it shows and upward climb. I want to locate an ideal point uptill where the data is linear at the beginning and fit a line. Thanks a lot. The data is attached (1st column is X and 2nd column is Y).
##### 댓글 수: 2없음 표시없음 숨기기
Bruno Luong 2023년 7월 19일
linear about 3.5 ? When I zoom in it is not clear where the linear starts. Not 3.5, not 2, may be on the interval (0,1)
Ahmed Zohaib 2023년 7월 19일
Thanks for the feedback. Okay, how do I locate the exact point where it loses linearity in between [0 1]?

댓글을 달려면 로그인하십시오.

### 채택된 답변

Chunru 2023년 7월 19일
whos
Name Size Bytes Class Attributes XY 52651x2 842416 double cmdout 1x33 66 char
[~, ia] = unique(XY(:, 1)); % remove the duplicated points
XY = XY(ia, :);
plot(XY(:,1), XY(:,2));
gg = movmedian(gg, 20); % to remove some spikes
hold on;
whos
Name Size Bytes Class Attributes XY 818x2 13088 double cmdout 1x33 66 char gg 818x1 6544 double ia 818x1 6544 double
% ignore some initial points
ip = 20; % 20 points
gg((ip+1):end)
ans = 798×1
0 0 0 0 0 0 0 0 0 0
i = find(abs(gg((ip+1):end))>20, 1, 'first'); % 2000 as a threshod (adjust it)
i = ip+i
i = 301
plot(XY(i,1), XY(i, 2), 'ro');
%xlim([2 3])

댓글을 달려면 로그인하십시오.

### 추가 답변 (1개)

Bruno Luong 2023년 7월 19일
편집: Bruno Luong 님. 2023년 7월 19일
Ths produces kind of "arbitrary" choice of the breakpoint, consider fitting the global curve with few line segments
X=XY(:,1);
Y=XY(:,2);
% FEX https://uk.mathworks.com/matlabcentral/fileexchange/25872-free-knot-spline-approximation
% it takes a dozain of seconds here
pp = BSFK(X,Y,2,[],[],struct('Animation',true))
xbreaks=pp.breaks(2)
ybreaks=ppval(pp,xbreaks)
plot(xbreaks,ybreaks,'or','MarkerSize',15)
##### 댓글 수: 1이전 댓글 -1개 표시이전 댓글 -1개 숨기기
Bruno Luong 2023년 7월 19일
If I crop the data up to X <= 4 it finds the break at
xbreaks=2.3085
As I said it's a mmoving target. The data is more or less exponetial everywhere. It is just a question of scaling, totally subjective.
X=XY(:,1);
Y=XY(:,2);
b = X < 4
% FEX https://uk.mathworks.com/matlabcentral/fileexchange/25872-free-knot-spline-approximation
% it takes a dozain of seconds here
pp = BSFK(X(b),Y(b),2,[],[],struct('Animation',true))
xbreaks=pp.breaks(2)
ybreaks=ppval(pp,xbreaks)
plot(xbreaks,ybreaks,'or','MarkerSize',15)

댓글을 달려면 로그인하십시오.

### 카테고리

Help CenterFile Exchange에서 Systems of Nonlinear Equations에 대해 자세히 알아보기

R2023a

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by