How do I fit a curve with a custom equation and a loop?
1 view (last 30 days)
Show older comments
GreenValleyB
on 16 Jul 2022
Answered: Star Strider
on 16 Jul 2022
I want to make a loop for a scatterplot and for each loop I want to do the fit curving to the plot with a custom equation. The equation for the scatterplot looks like this:
i_vals = [1 8 9 10]
j_vals = 1:10
for i = 1:length(i_vals)
for j = 1:length(j_vals)
scatter(eave(j, i_vals(i)), epsilonacc(j,i_vals(i)) ./ f_ampl(i_vals(i)), "sk")
hold on
end
end
hold off
title("Alle Proben bei N = 100")
xlabel("Porenzahl e")
ylabel("\epsilon^{acc} / f_{ampl}")
%legend
clear ('i_vals')
[1 8 9 10] - these are four samples
1:10 - ten rows per sample (representing N=10, N=100, N=500 ... N=100.000)
The scatter plot that you get from my code looks like this:
Each loop creates four points in a horizontal way. It should create something similar to this one (source: T. Wichtmann, A. Niemunis, Th. Triantafyllidis):
The function I want to use for the curve fitting ist the following:
f = kn .* ( (Ce - e).^2 ./ '(1 + e) )
Ce being a constant, e being a variable and kn being a constant which won't be used later.
If it doesn't work for this big amount of loops, than individual takes are also possible. At the end I need to get an average value of all the fitting curves to determine a constant.
0 Comments
Accepted Answer
Star Strider
on 16 Jul 2022
The posted code needs the required variables and functions necessary to run it.
That aside, trysoimething like this —
a = linspace(0, atan(0.75/0.62), 7); % Create Missing Data
r = [0.52; 0.56; 0.62; 0.66]+0.1; % Create Missing Data
r = logspace(log10(0.52), log10(0.66), 7).'; % Create Missing Data
emx = r*cos(a); % Create Missing Data
emy = r*sin(a)+0.1; % Create Missing Data
f = @(kn,Ce,e) kn .* ( (Ce - e).^2 ./ (1 + e) );
b0 = randi(9,2,1) % Choose Appropriate Initial Parameter Estimates
for k = 1:numel(a)
B(:,k) = fminsearch(@(b)norm(emy(:,k) - f(b(1),b(2),emx(:,k))), b0);
end
figure
plot(emx, emy, 's')
hold on
emxv = linspace(min(emx(:)), max(emx(:)), 50);
emxv = linspace(0, max(emx(:)), 50);
for k = 1:numel(a)
plot(emxv, f(B(1,k),B(2,k),emxv))
end
hold off
grid
There appears to be more to this than was posted, however this should get you started.
.
0 Comments
More Answers (0)
See Also
Categories
Find more on Scatter Plots in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!