Page 1 of 2
Tie several variables to a common value
Posted: Mon Feb 01, 2016 4:20 pm
by thanasis
Sometimes, we need to define multiple instances of the same variable which should have the same value (i.e. be treated as a single variable from an error-minimization perspective).
E.g. three hyperfine couplings to the same spin:
Code: Select all
ACuxy = 15;
ACuz = 150;
Sys.S=1/2;
Sys.g=[gxy gz];
Sys.Nucs='Cu,Cu,Cu';
Sys.A=[ACuxy ACuz; ACuxy ACuz; ACuxy ACuz];
Vary.g = [0 0];
Vary.A = [0 50; 0 50; 0 50];
Or, three spins forming an equilateral triangle:
Code: Select all
J = 100;
Sys.S = [1/2 1/2 1/2]; % three electron spins
Sys.ee = [J J J]; % three coupling (1-2,1-3,2-3)
Vary.ee = [10 10 10];
In both cases, each instance of the interaction ACuz or J is initiated at the same value and varies within the same intervals, but it follows its own course during the minimisation process. So, even if physically the value for all variables should be the same, computationally they may diverge.
Is there a way to tie all interactions together, so as they are fitted as a single variable?
Thanks in advance
Re: Tie several variables to a common value
Posted: Mon Feb 01, 2016 6:42 pm
by Matt Krzyaniak
You can do that relatively easily through custom functions, refer to
http://www.easyspin.org/forum/viewtopic.php?p=587#p587 as a general way to implement a similar idea, or towards the bottom of
http://easyspin.org/easyspin/documentat ... tting.html under the heading User-defined simulation functions
Re: Tie several variables to a common value
Posted: Tue Feb 02, 2016 2:31 am
by thanasis
Thanks for the pointers!
I will look into them.
Re: Tie several variables to a common value
Posted: Tue Feb 02, 2016 6:45 am
by thanasis
OK, as per
http://easyspin.org/easyspin/documentat ... omfunction, I have defined the function constrain.m as follows:
Code: Select all
function y = constrain(Sys1,Exp,Opt);
fullSys = Sys1;
fullSys.A = [Sys1.A; Sys1.A; Sys1.A];
fullSys.Nucs = 'Cu,Cu,Cu';
[x,y] = pepper(fullSys,Exp,Opt);
return
Then, I define my system where I want to tie together the three hyperfines and call constrain to do the fit
Code: Select all
gxy = 1.5;
gz=2.23;
w1=4;
w2=4;
ACuz=220;
%The spin system
%--------------------------------------------------------------------------
Sys1.S=1/2;
Sys1.g=[gxy gz];
Sys1.lwpp=[w1 w2];
Sys1.Nucs='Cu,Cu,Cu';
Sys1.A=[0 ACuz; 0 ACuz; 0 ACuz];
%Experimental
%--------------------------------------------------------------------------
Exp.Temperature = 4.1; Exp.mwFreq=9.423859; Exp.CenterSweep=[380.0 240.0]; Exp.nPoints=2048;
% Fitting
%--------------------------------------------------------------------------
Vary1.g = [0.1 0.1];
Vary1.lwpp = [5 5];
Vary1.A = [0 50; 0 50; 0 50];
[B, spc, params] = eprload('lm024_6.spc')
FitOpt.Method = 'simplex fcn'; % simplex algorithm, data as is
FitOpt.Scaling = 'maxabs';
esfit('constrain',spc,Sys1,Vary1,Exp,[],FitOpt);
The fitting screen comes up with the data curvem but when I start it I get the error message:
Code: Select all
Error using pepper (line 179)
Size of Sys.A (9x2) is inconsistent with number of nuclei (3) and electrons (1).
Error in pepper (line 127)
Error in constrain (line 7)
[x,y] = pepper(fullSys,Exp,Opt);
Error in esfit>assess (line 794)
Error in esfit_simplex (line 77)
Error in esfit>runFitting (line 651)
Error while evaluating UIControl Callback
Re: Tie several variables to a common value
Posted: Tue Feb 02, 2016 6:55 am
by thanasis
OK, probably I found my error, but please do confirm:
In my fitting code I changed to:
...and...
and then the three hyperfines are fitted as one.
Re: Tie several variables to a common value
Posted: Tue Feb 16, 2016 8:33 pm
by Stefan Stoll
Sys.A
must contain one set of one/two/three hyperfine values for each pair of electron and nuclear spins. So if you have 3 electron spins and 3 magnetic nuclei, you need 9 hyperfine sets. See the documentation
here.
Re: Tie several variables to a common value
Posted: Wed Feb 17, 2016 2:02 am
by thanasis
Indeed, I had looked into that to simulate the full system.
However, to lighten up the CPU/memory load, I have been trying to fit only the S = 1/2 ground state, which I coupled to the three nuclear spins.
(I suppose my code is valid for that approach?)
As a second step, I will be looking into fitting the whole system, including J coupling and AE.
Thanks for the feedback.
Re: Tie several variables to a common value
Posted: Wed Sep 28, 2016 10:18 am
by Yahor Savich
This is a very useful thread, but I have to use different Exp variables for my components. I am fitting a multi-component oriented data with different orientation and here is the custom function I use:
Code: Select all
function [x,y] = pepperOG(Sys,Exp)
Exp.Ordering = @(phi,theta) gaussian(theta,Sys.theta0*pi/180,Sys.Dtheta*pi/180).*gaussian(phi,Sys.phi0*pi/180, Sys.Dphi*pi/180);
Exp.mwFreq = Sys.mwFreq;
[x,y] = pepper(Sys,Exp);
During the fitting I want to keep A and g tensors to be the same for all components, but still be varied. However, if I double the number of species:
Code: Select all
function [x,y] = dimer(Sys,Exp)
fullSys = Sys;
fullSys.g = [Sys.g; Sys.g]
fullSys.S = [1/2 1/2]
fullSys.A = [Sys.A, Sys.A];
fullSys.Nucs = '14N';
fullSys.ee=1e-3;
[x,y] = pepper(fullSys,Exp)
I cannot have different Exp variables for those species.
So my question is how to keep Exp.Ordering to be different for different components but still vary the same A and g tensors for all components.
This post explains how to perform multi-frequency fit, by merging axes while having two different Exp variables, but I have slightly different problem.
Re: Tie several variables to a common value
Posted: Fri Sep 30, 2016 2:30 pm
by Stefan Stoll
If you have a multi-component situation, then it is better to use
Code: Select all
[B,spc] = pepper({Sys1,Sys2},Exp,Opt)
instead of merging
Sys1
and
Sys2
with a fake coupling. If your
Exp.Ordering
needs to be different for the different components, use two
pepper
calls and add the results.
Re: Tie several variables to a common value
Posted: Mon Oct 03, 2016 10:02 am
by Yahor Savich
Yes, that was my motivation to construct pepperOG function. But since esfit parses through the components, the code below won't keep same g tensors changing simultaneously:
Code: Select all
Sys1.g = [2.007 2.006 2.002];
Sys2.g = Sys1.g;
Vary1.g = [0 0 0.005];
Vary2.g = 0;
Currently I have to vary g tensors for Sys1 and Sys2 individually and equate them manually