How to integrate one variable in a multivariate formulation+ nonlinear curvefitting
2 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Hello everyone,
I am facing a probelm with integration, I want to integrate a multiplication of two terms below is the codes:
function y = MH(para,x)
A = para(1);
mu = para(2);
Ms = para(3);
sigma = para(4);
C = para(5);
kb=1.38065e-23;
T=295;
lognormal =@(d) exp(-(log(d/mu).^2/(2*sigma^2)))./(d*sigma*sqrt((2*pi)));
langevin =@(d,x) coth(((d.^3).*pi/6*Ms*x)/(kb*T))-(kb*T)./(pi/6*Ms*x.*d.^3);
integrand = @(d) ((pi/6)*d.^3).*langevin(d,x).*lognormal(d);
y = A*integral(integrand,0,inf)+C*x;
end
Actually, I am trying to fit a M(H) curve, the formulation is:
where
,
The unknown parameters are A, Ms, Sigma, Mu and C,.
The two variables are H and d, H is the xdata with a dimension of (61×1) and in this code it is replaced as x, d is the variable that should be integrated and has a limit of integration of (0,inf).
The problem is, the part 'intergrand' isn't integrated at all and it isn't fitted, only the part C*x is fitted, the returned parameter Ms, Sigma and Mu doesn't change from the estimated parameter at beginning, only A and C changed, the result is as below:
Red points are the data that need to be fitted and blue line is the fitting curve.
May I ask what's the reason for that? Thanks for any help in advance!
0 Commenti
Risposta accettata
Star Strider
il 17 Giu 2021
First, use element-wise operations for everything in the ‘MH’ function.
Second, in the integration use the 'ArrayValued',1 name-value pair.
In ‘integrand’, the argument to lognormal is squared, so I added that, and it seems to work with it, although not without it.
With my synthetic data, I get a decent fit, however the function always returns at least one NaN value. I added the fillmissing call to correct for that in order to test the code, however it may not be necessary with your actual data. If it is, it will be necessary to see what is causing the NaN value. It is not obvious to me what is causing it.
x = (-6:0.24:6)*1E4; % Create Data
y = tanh(x*1E-4) + x*1E-8; % Create Data
B0 = rand(5,1)*100; % Use Appropriate Initial Estimates
B = lsqcurvefit(@MH, B0, x, y)
figure
plot(x, y, '.')
hold on
plot(x, MH(B,x), '-r')
hold off
grid
function y = MH(para,x)
A = para(1);
mu = para(2);
Ms = para(3);
sigma = para(4);
C = para(5);
kb=1.38065e-23;
T=295;
lognormal =@(d) exp(-(log(d/mu).^2./(2*sigma^2)))./(d*sigma*sqrt((2*pi)));
langevin =@(d,x) coth(((d.^3).*pi./6*Ms*x)./(kb*T))-(kb*T)./(pi/6*Ms*x.*d.^3);
integrand = @(d) ((pi/6)*d.^3).*langevin(d,x).*lognormal(d.^2);
y = A*integral(integrand,0,inf, 'ArrayValued',1)+C*x;
y = fillmissing(y,'nearest'); % May Not Be Necessary
end
.
11 Commenti
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Startup and Shutdown in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!