Hello,
I am trying to fit data from a file. For that I have created data with simply a sine wave function. Here is my code:
load test_fit
Error using load
Unable to find file or directory 'test_fit.txt'.
x = test_fit(:,1);
y = test_fit(:,2);
fo=fit(y,x,'a*sin(b*x+c)+d');
plot(fo,y,x)
But the results I got are clearly not good:
I'm just wondering if I should specify somwhere the number of itterations or the fitting constrains?
Thank you in advance for any help or comments!

 採用された回答

Rik
Rik 2022 年 9 月 27 日
編集済み: Rik 2022 年 9 月 27 日

1 投票

You can specify those parameters, but what is much more effective is providing good initial guesses (and not mixing up x and y):
test_fit=load(websave('test_fit.txt','https://www.mathworks.com/matlabcentral/answers/uploaded_files/1137860/test_fit.txt'));
x = test_fit(:,1);
y = test_fit(:,2);
plot(x,y,'*')
fo=fit(x,y,'a*sin(b*x+c)+d','StartPoint',[1 4 0 2])
fo =
General model: fo(x) = a*sin(b*x+c)+d Coefficients (with 95% confidence bounds): a = 1 (1, 1) b = 4 (4, 4) c = 0.3927 (0.3927, 0.3927) d = 2 (2, 2)
hold on,plot(fo)

10 件のコメント

Piotr
Piotr 2022 年 9 月 29 日
Hi Rik,
Thank you that is really helpful. I have one more question I would like to combine the fitting with the reading data from a an image, but getting an error. Maybe you can help me to solve it?
That is my code:
I=imread('testf5.png');
x = [size(I,2)/2 size(I,2)/2];
y = [0 size(I,1)];
c = improfile(I,x,y);
figure
subplot(2,1,1)
imshow(I)
hold on
plot(x,y,'r')
subplot(2,1,2)
plot(c(:,1,1),'r')
fo=fit(x,y,'m*sin(n*x+o)+p','StartPoint',[125 100 0 125])
but it doesnt like the y column format (I got this error mesage: Y must be a column vector)
Rik
Rik 2022 年 9 月 29 日
If the fit function requires column vectors, why don't you transpose x and y to be column vectors?
But there is a fundamental problem here: you have 2 points, to which you are fitting an equation with 4 unknowns. That is not going to be a reliable fit. It seems like you want to use the profile as your data, but you don't.
Piotr
Piotr 2022 年 9 月 29 日
Okay I transformed to column vector with:
fo=fit(x(:),y(:),'m*sin(n*x+o)+p','StartPoint',[125 100 0 125])
and also got the error about insuficient point number which I don't understand becaouse there are many points:
Rik
Rik 2022 年 9 月 29 日
Where exactly are you telling the fit function that you want to use all those points? (Hint: you don't)
Piotr
Piotr 2022 年 9 月 29 日
This I don't fully understand, do I need to then read the data from the graph? I started to use Matlab only recently
Rik
Rik 2022 年 9 月 29 日
編集済み: Rik 2022 年 9 月 29 日
You provide x and y as input arguments to the fit function, but that only contains the coordinates of the line you're using for improfile, not the data you're plotting. You probably want to use fit(x_adapted,c,___). That first variable should contain the x position for each value in c. Currently when you're plotting your data, you are implicitly using the index as the x-value. That's fine for getting a first impression of your data, but not for actual analysis.
You probably want this:
x_adapted = linspace(y(1),y(2),numel(c));
I would also suggest doing a basic Matlab tutorial. The Onramp tutorial is provided for free by Mathworks.
Piotr
Piotr 2022 年 9 月 30 日
編集済み: Rik 2022 年 9 月 30 日
Okay, thank you now that is clear but still got an error with fit weights. Even if I define wieghts I still get it
Error using fit>iFit
X, Y and WEIGHTS cannot have NaN values.
Error in fit (line 116)
[fitobj, goodness, output, convmsg] = iFit( xdatain, ydatain, fittypeobj, ...
Error in testfitimage (line 20)
fo=fit(transpose(x_adapted),c(:,1,1),ft)
websave('testf5.png','https://www.mathworks.com/matlabcentral/answers/uploaded_files/1139785/testf5.png');
I=imread('testf5.png');
x = [size(I,2)/2 size(I,2)/2];
y = [0 size(I,1)];
c = improfile(I,x,y);
figure
subplot(2,1,1)
imshow(I)
hold on
plot(x,y,'-o')
subplot(2,1,2)
plot(c(:,1,1),'-o')
x_adapted = linspace(y(1),y(2),numel(c(:,1,1)));
ft = fittype('m*sin(n*x+o)+p');
options=fitoptions(ft);
options.StartPoint = [125 100 0 125];
options.Weights = [1,1];
plot(x_adapted(:),c(:,1,1))
fo=fit(transpose(x_adapted),c(:,1,1),ft)
Error using fit>iFit
X, Y and WEIGHTS cannot have NaN values.

Error in fit (line 116)
[fitobj, goodness, output, convmsg] = iFit( xdatain, ydatain, fittypeobj, ...
Walter Roberson
Walter Roberson 2022 年 9 月 30 日
x = [size(I,2)/2 size(I,2)/2];
y = [0 size(I,1)];
c = improfile(I,x,y);
y = 0 is outside the image coordinates, so the profile gives NaN at that location.
Rik
Rik 2022 年 9 月 30 日
If you look at the code below, you see that c starts with a NaN. So we should remove it.
I = imread(websave('testf5.png','https://www.mathworks.com/matlabcentral/answers/uploaded_files/1139785/testf5.png'));
x = [size(I,2)/2 size(I,2)/2];
y = [0 size(I,1)];
c = improfile(I,x,y);
c = c(:,1,1); % select red chanel
x_adapted = linspace(y(1),y(2),numel(c));
x_adapted = x_adapted.'; % transpose 1x1491 to 1491x1
subplot(2,1,1)
imshow(I)
hold on
plot(x,y,'-o')
hold off
subplot(2,1,2)
plot(x_adapted,c)
ft = fittype('m*sin(n*x+o)+p');
options=fitoptions(ft);
options.StartPoint = [125 100 0 125];
options.Weights = [1,1];
find(isnan(x_adapted)),find(isnan(c))
ans = 0×1 empty double column vector
ans = 1
Here is the problem, so we'll have to remove that point.
L = isnan(x_adapted) | isnan(c); % the first part is just good habit
x_adapted(L) = [];
c(L) = [];
% Now we can safely to the fit:
fo=fit(x_adapted,c,ft,StartPoint=[125 100 0 125])
fo =
General model: fo(x) = m*sin(n*x+o)+p Coefficients (with 95% confidence bounds): m = 0.15 (-6.376, 6.676) n = 100 (99.9, 100.1) o = -0.001634 (-87.15, 87.15) p = 129.3 (124.6, 133.9)
figure,plot(fo)
So the fit is not great, you will have to adjust the start point.
Rik
Rik 2022 年 9 月 30 日
If my answer helped you, please consider marking it as accepted answer.

サインインしてコメントする。

その他の回答 (0 件)

質問済み:

2022 年 9 月 27 日

コメント済み:

Rik
2022 年 9 月 30 日

Community Treasure Hunt

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

Start Hunting!

Translated by