Chi square minimisation wrt variables in an integral?

Click For Summary

Discussion Overview

The discussion revolves around the challenges of performing chi square minimization with respect to parameters in a model that involves an integral. Participants are exploring the implementation of this minimization in Mathematica, particularly focusing on the integration of variables that are also part of the minimization process.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant describes their attempt to fit a model curve to data using chi square minimization with respect to parameters a, b, and NN, noting the complexity introduced by the integral in their model.
  • The same participant expresses uncertainty about whether Mathematica can handle minimization of a function that involves integration and seeks guidance on potential syntax issues.
  • Another participant suggests that the original code has issues, such as using the same variable for both the integration variable and the index of the data list, which could lead to confusion.
  • This second participant also proposes making certain functions explicit with delayed evaluation to ensure proper functioning during minimization.
  • They note that after making adjustments, the code runs but returns all zeros for the minimum values, indicating that while the code executes, it may not yield the desired results.

Areas of Agreement / Disagreement

Participants have not reached a consensus on the effectiveness of the proposed solutions, as one participant's adjustments allow the code to run, but the results are not satisfactory. There remains uncertainty about the correct approach to achieve the intended minimization.

Contextual Notes

Participants highlight potential limitations in the original code, including variable naming conflicts and the need for explicit function definitions. However, the discussion does not resolve these issues definitively.

CAF123
Gold Member
Messages
2,918
Reaction score
87
I'm trying to fit a model curve to some data by performing a chi square minimisation wrt three parameters a,b and NN. The trouble I am having is that the variables with which I want to minimise the chi square with respect to appear in an integral. I attach the code I am working with.

Code:
    Needs["ErrorBarPlots`"]

    MasData5 = {{{44.8, 47.5}, ErrorBar[4.0]}, {{54.8, 50.1},
    ErrorBar[4.2]}, {{64.8, 61.7}, ErrorBar[5.1]}, {{74.8, 64.8},
    ErrorBar[5.5]}, {{84.9, 75}, ErrorBar[6.2]}, {{94.9, 81.2},
    ErrorBar[6.7]}, {{104.9, 85.3}, ErrorBar[7.1]}, {{119.5, 94.5},
    ErrorBar[7.5]}, {{144.1, 101.5}, ErrorBar[8.3]}, {{144.9, 101.9},
    ErrorBar[10.9]}, {{162.5, 117.8},
    ErrorBar[12.8]}, {{177.3, 130.2},
    ErrorBar[13.4]}, {{194.8, 147.7},
    ErrorBar[17.1]}, {{219.6, 137.4},
    ErrorBar[20.1]}, {{244.8, 176.6},
    ErrorBar[20.3]}, {{267.2, 178.7},
    ErrorBar[21.1]}, {{292.3, 200.4}, ErrorBar[29.1]}, {{60, 55.8},
    ErrorBar[4.838]}, {{80, 66.6}, ErrorBar[7.280]}, {{100, 73.4},
    ErrorBar[6.426]}, {{120, 86.7}, ErrorBar[7.245]}, {{140, 104},
    ErrorBar[12.083]}, {{160, 110}, ErrorBar[16.279]}, {{42.5, 43.8},
    ErrorBar[3.482]}, {{55, 57.2}, ErrorBar[3.980]}, {{65, 62.5},
    ErrorBar[4.614]}, {{75, 68.9}, ErrorBar[5.197]}, {{85, 72.1},
    ErrorBar[5.523]}, {{100, 81.9}, ErrorBar[5.368]}, {{117.5, 95.7},
    ErrorBar[6.277]}, {{132.5, 103.9}, ErrorBar[6.912]}, {{155, 115},
    ErrorBar[7.920]}, {{185, 129.1}, ErrorBar[9.192]}, {{215, 141.7},
    ErrorBar[10.666]}, {{245, 140.3}, ErrorBar[14.526]}, {{275, 189},
    ErrorBar[24.274]}, {{49, 39.2}, ErrorBar[10]}, {{86, 75.7},
    ErrorBar[14.414]}, {{167, 118}, ErrorBar[22.828]}, {{43.2, 50.7},
    ErrorBar[1.5]}, {{50, 59.5}, ErrorBar[1.4]}, {{57.3, 61.8},
    ErrorBar[1.9]}, {{65.3, 67.6}, ErrorBar[1.7]}, {{73.9, 72.4},
    ErrorBar[1.9]}, {{83.2, 79.9}, ErrorBar[2.3]}, {{93.3, 84.4},
    ErrorBar[2.1]}, {{104.3, 86.7}, ErrorBar[2.7]}, {{47.9, 55.4},
    ErrorBar[2.1]}, {{68.4, 66.4}, ErrorBar[2.9]}}; (*this is the experimental data *)

    gamma = 5.55*^-6;
    MJpsi = 3.1;
    alphaem = 1/137;
    alphas[k_] = 4*Pi/9/Log[k/lambda];
    lambda = 0.09;
    Ca = 3; (*list of constants and k dependent function alphas*)

    xg = NN*((4*qbar)/((4*qbar - MJpsi^2) + w^2))^(-a)*(qbar)^b*Exp[Sqrt[16*Ca/9*Log[(4*qbar - MJpsi^2 + w^2)/(4*qbar)]*
     Log[Log[qbar/lambda]/Log[qo/lambda]]]] (* def xg, appearing in below *)

    F5[w_] = 3.89379*^5*1/4.5/16*4*Pi^3*MJpsi^3*
    gamma/12/
     alphaem*(NIntegrate[
        alphas[k_]/qbar/(qbar + k)*
         D[(2^(2*(D[Log[xg],
                    Log[1/(((4*qbar))/((4*qbar - MJpsi^2) +
                    w^2))]]) + 3)/Sqrt[Pi]*
             Gamma[D[Log[xg],
                 Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]] +
                5/2]/ Gamma[
               D[Log[xg],
                 Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]] +
                4])*NN* (((4*qbar))/((4*qbar - MJpsi^2) +
                w^2))^(-a)*(k)^b*
           Exp[Sqrt[
             16*Ca/9*Log[(4*qbar - MJpsi^2 + w^2)/(4*qbar)]*
              Log[Log[k/lambda]/Log[qo/lambda]]]], k], {k,
         qo, (w^2 - MJpsi^2)/4}] +
       0.118/qbar/qo*Log[(qbar + qo)/qbar]*
        NN* ((4*qbar)/((4*qbar - MJpsi^2) + w^2))^(-a)*(qo)^
         b*(2^(2*(D[Log[xg],
                 Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]]) +
              3)/Sqrt[Pi]*
          Gamma[D[Log[xg],
              Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]] + 5/2]/
           Gamma[D[Log[xg],
              Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]] +
             4]))^2; /. { qbar -> 2.4025, qo -> 2} (*my model function - involves a numerical integration over variable k *)

      chisq5 = Sum[((MasData5[[k]][[1]][[2]] - F5[MasData5[[k]][[1]][[1]]])/
      MasData5[[k]][[2]][[1]])^2, {k, 1, Length[MasData5]}]; (*def of my chi square function *)

      rr = Minimize[chisq5, {a, b, NN}] (*minimise chi square wrt a,b,NN *)

This gives me an error that the output is not a number at {a,b,NN}. Can mathematica handle minimisation of a function wrt variables that are involved in an integration? I would have thought yes as the numerical integration involved is simply a nested operation but perhaps I have to adapt my syntax. Or perhaps the error is simply something else I overlooked? Thanks for any pointers.
 
Physics news on Phys.org
Ignore what I wrote below. I see that you are trying to differentiate with respect to a defined function in your expression:
D[Log[xg], Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]]

I don't see how this is ever going to work.Mathematica should be able to do this. I got it to run by making the following changes:

(1) You were using the same variable k for the integration variable and the index of the MasData5 list. I suspect this isn't what you wanted.
(2) I explicitly defined q0 and qbar, rather than assigning them. This may not be necessary.
(3) I made xg, F5, and chisq5 explicit functions with delayed evaluation. (the :=) I think you need to do this in order for Minimize to work.
(4) You had alphas[k_] on the RHS of F5. This won't work. It should be alphas[k].

At any rate, it now runs, but returns all zeros for the minimum values. It may not be doing what you want, but at least it runs now.
Code:
In[1]:= Needs["ErrorBarPlots`"]
In[2]:= MasData5={{{44.8,47.5},ErrorBar[4.0]},{{54.8,50.1},ErrorBar[4.2]},{{64.8,61.7},ErrorBar[5.1]},{{74.8,64.8},ErrorBar[5.5]},{{84.9,75},ErrorBar[6.2]},{{94.9,81.2},ErrorBar[6.7]},{{104.9,85.3},ErrorBar[7.1]},{{119.5,94.5},ErrorBar[7.5]},{{144.1,101.5},ErrorBar[8.3]},{{144.9,101.9},ErrorBar[10.9]},{{162.5,117.8},ErrorBar[12.8]},{{177.3,130.2},ErrorBar[13.4]},{{194.8,147.7},ErrorBar[17.1]},{{219.6,137.4},ErrorBar[20.1]},{{244.8,176.6},ErrorBar[20.3]},{{267.2,178.7},ErrorBar[21.1]},{{292.3,200.4},ErrorBar[29.1]},{{60,55.8},ErrorBar[4.838]},{{80,66.6},ErrorBar[7.280]},{{100,73.4},ErrorBar[6.426]},{{120,86.7},ErrorBar[7.245]},{{140,104},ErrorBar[12.083]},{{160,110},ErrorBar[16.279]},{{42.5,43.8},ErrorBar[3.482]},{{55,57.2},ErrorBar[3.980]},{{65,62.5},ErrorBar[4.614]},{{75,68.9},ErrorBar[5.197]},{{85,72.1},ErrorBar[5.523]},{{100,81.9},ErrorBar[5.368]},{{117.5,95.7},ErrorBar[6.277]},{{132.5,103.9},ErrorBar[6.912]},{{155,115},ErrorBar[7.920]},{{185,129.1},ErrorBar[9.192]},{{215,141.7},ErrorBar[10.666]},{{245,140.3},ErrorBar[14.526]},{{275,189},ErrorBar[24.274]},{{49,39.2},ErrorBar[10]},{{86,75.7},ErrorBar[14.414]},{{167,118},ErrorBar[22.828]},{{43.2,50.7},ErrorBar[1.5]},{{50,59.5},ErrorBar[1.4]},{{57.3,61.8},ErrorBar[1.9]},{{65.3,67.6},ErrorBar[1.7]},{{73.9,72.4},ErrorBar[1.9]},{{83.2,79.9},ErrorBar[2.3]},{{93.3,84.4},ErrorBar[2.1]},{{104.3,86.7},ErrorBar[2.7]},{{47.9,55.4},ErrorBar[2.1]},{{68.4,66.4},ErrorBar[2.9]}};(*this is the experimental data*)
In[3]:= gamma=5.55*^-6;
MJpsi=3.1;
alphaem=1/137;
alphas[k_]=4*Pi/9/Log[k/lambda];
lambda=0.09;
Ca=3;(*list of constants and k dependent function alphas*)
qbar=2.4025;
qo=2.0;

xg[w_, a_, b_, NN_]:=NN*((4*qbar)/((4*qbar-MJpsi^2)+w^2))^(-a)*(qbar)^b*Exp[Sqrt[16*Ca/9*Log[(4*qbar-MJpsi^2+w^2)/(4*qbar)]*Log[Log[qbar/lambda]/Log[qo/lambda]]]] (*def xg,appearing in below*)
In[12]:=
F5[w_, a_, b_, NN_] :=
 3.89379*^5*1/4.5/16*4*Pi^3*MJpsi^3*
  gamma/12/alphaem*(NIntegrate[
      alphas[k]/qbar/(qbar + k)*
       D[(2^(2*(D[Log[xg[w, a, b, NN]],
                  Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]]) +
               3)/Sqrt[Pi]*
           Gamma[D[Log[xg[w, a, b, NN]],
               Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]] + 5/2]/
            Gamma[D[Log[xg[w, a, b, NN]],
               Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]] + 4])*
         NN*(((4*qbar))/((4*qbar - MJpsi^2) + w^2))^(-a)*(k)^b*
         Exp[Sqrt[
           16*Ca/9*Log[(4*qbar - MJpsi^2 + w^2)/(4*qbar)]*
            Log[Log[k/lambda]/Log[qo/lambda]]]], k], {k,
       qo, (w^2 - MJpsi^2)/4}] +
     0.118/qbar/qo*Log[(qbar + qo)/qbar]*
      NN*((4*qbar)/((4*qbar - MJpsi^2) + w^2))^(-a)*(qo)^
       b*(2^(2*(D[Log[xg[w, a, b, NN]],
               Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]]) + 3)/
         Sqrt[Pi]*
        Gamma[D[Log[xg[w, a, b, NN]],
            Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]] + 5/2]/
         Gamma[D[Log[xg[w, a, b, NN]],
            Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]] +
         
           4]))^2;(*my model function-involves a numerical \
integration over variable k*)
In[17]:= chisq5[a_,b_,NN_]:=Sum[((MasData5[[j]][[1]][[2]]-F5[MasData5[[j]][[1]][[1]],a,b,NN])/MasData5[[j]][[2]][[1]])^2,{j,1,Length[MasData5]}];(*def of my chi square function*)
In[18]:= rr=Minimize[chisq5,{a,b,NN}] (*minimise chi square wrt a,b,NN*)
 
Last edited:
Hi phyzguy,
phyzguy said:
Ignore what I wrote below. I see that you are trying to differentiate with respect to a defined function in your expression:
D[Log[xg], Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]]

I don't see how this is ever going to work.
Oh, why wouldn't it work? The derivative is just equal to this function ->

Code:
 In[1] := D[Log[xg], Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]]

Out[1]:= (2 Log[Log[11.1111 qbar]/Log[11.1111 qo]])/(Sqrt[3] Sqrt[ Log[(-9.61 + 4 qbar + w^2)/(4 qbar)] Log[Log[11.1111 qbar]/ Log[11.1111 qo]]])
Mathematica should be able to do this. I got it to run by making the following changes:

(1) You were using the same variable k for the integration variable and the index of the MasData5 list. I suspect this isn't what you wanted.
(2) I explicitly defined q0 and qbar, rather than assigning them. This may not be necessary.
(3) I made xg, F5, and chisq5 explicit functions with delayed evaluation. (the :=) I think you need to do this in order for Minimize to work.
(4) You had alphas[k_] on the RHS of F5. This won't work. It should be alphas[k].

At any rate, it now runs, but returns all zeros for the minimum values. It may not be doing what you want, but at least it runs now.
Thanks. I input these changes but at the very last step I replaced chisq5 with chisq5[a_,b_,NN_] and it still gave me same errors. I think the returning of zeroes was that it didn't know what chisq5 was.
 
So why don't you try replacing those derivatives with the actual functions if you know what they are, and then past in your new code and let me take a look. If you do that, can you define q0 and qbar ahead of time?
 
Sure, here it is:

Code:
Needs["ErrorBarPlots`"]

MasData5 = {{{44.8, 47.5}, ErrorBar[4.0]}, {{54.8, 50.1}, 
    ErrorBar[4.2]}, {{64.8, 61.7}, ErrorBar[5.1]}, {{74.8, 64.8}, 
    ErrorBar[5.5]}, {{84.9, 75}, ErrorBar[6.2]}, {{94.9, 81.2}, 
    ErrorBar[6.7]}, {{104.9, 85.3}, ErrorBar[7.1]}, {{119.5, 94.5}, 
    ErrorBar[7.5]}, {{144.1, 101.5}, ErrorBar[8.3]}, {{144.9, 101.9}, 
    ErrorBar[10.9]}, {{162.5, 117.8}, 
    ErrorBar[12.8]}, {{177.3, 130.2}, 
    ErrorBar[13.4]}, {{194.8, 147.7}, 
    ErrorBar[17.1]}, {{219.6, 137.4}, 
    ErrorBar[20.1]}, {{244.8, 176.6}, 
    ErrorBar[20.3]}, {{267.2, 178.7}, 
    ErrorBar[21.1]}, {{292.3, 200.4}, ErrorBar[29.1]}, {{60, 55.8}, 
    ErrorBar[4.838]}, {{80, 66.6}, ErrorBar[7.280]}, {{100, 73.4}, 
    ErrorBar[6.426]}, {{120, 86.7}, ErrorBar[7.245]}, {{140, 104}, 
    ErrorBar[12.083]}, {{160, 110}, ErrorBar[16.279]}, {{42.5, 43.8}, 
    ErrorBar[3.482]}, {{55, 57.2}, ErrorBar[3.980]}, {{65, 62.5}, 
    ErrorBar[4.614]}, {{75, 68.9}, ErrorBar[5.197]}, {{85, 72.1}, 
    ErrorBar[5.523]}, {{100, 81.9}, ErrorBar[5.368]}, {{117.5, 95.7}, 
    ErrorBar[6.277]}, {{132.5, 103.9}, ErrorBar[6.912]}, {{155, 115}, 
    ErrorBar[7.920]}, {{185, 129.1}, ErrorBar[9.192]}, {{215, 141.7}, 
    ErrorBar[10.666]}, {{245, 140.3}, ErrorBar[14.526]}, {{275, 189}, 
    ErrorBar[24.274]}, {{49, 39.2}, ErrorBar[10]}, {{86, 75.7}, 
    ErrorBar[14.414]}, {{167, 118}, ErrorBar[22.828]}, {{43.2, 50.7}, 
    ErrorBar[1.5]}, {{50, 59.5}, ErrorBar[1.4]}, {{57.3, 61.8}, 
    ErrorBar[1.9]}, {{65.3, 67.6}, ErrorBar[1.7]}, {{73.9, 72.4}, 
    ErrorBar[1.9]}, {{83.2, 79.9}, ErrorBar[2.3]}, {{93.3, 84.4}, 
    ErrorBar[2.1]}, {{104.3, 86.7}, ErrorBar[2.7]}, {{47.9, 55.4}, 
    ErrorBar[2.1]}, {{68.4, 66.4}, ErrorBar[2.9]}};
(*h1 2006 Q^2=0 data , zeus 2002, zeus 2004 and h1 2013 data for \
Q^2=0*)

gamma = 5.55*^-6;
MJpsi = 3.1;
alphaem = 1/137;

xg = NN* ((4*qbar)/((4*qbar - MJpsi^2) + w^2))^(-a)*(qbar)^b*
   Exp[Sqrt[
     16*Ca/9*Log[(4*qbar - MJpsi^2 + w^2)/(4*qbar)]*
      Log[Log[qbar/lambda]/Log[qo/lambda]]]];

deriv = D[Log[xg], Log[1/(((4*qbar))/((4*qbar - MJpsi^2) + w^2))]]

alphas[k_] = 4*Pi/9/Log[k/lambda]; 
lambda = 0.09;
Ca = 3;
qbar = 2.4025;
qo = 2;

F5[w_] := 3.89379*^5*1/4.5/16*4*Pi^3*MJpsi^3*
  gamma/12/alphaem*(NIntegrate[
      alphas[k]/qbar/(qbar + k)*
       D[(2^(2*(deriv) + 3)/Sqrt[Pi]*
           Gamma[deriv + 5/2]/ Gamma[deriv + 4])*
         NN* (((4*qbar))/((4*qbar - MJpsi^2) + w^2))^(-a)*(k)^b*
         Exp[Sqrt[
           16*Ca/9*Log[(4*qbar - MJpsi^2 + w^2)/(4*qbar)]*
            Log[Log[k/lambda]/Log[qo/lambda]]]], k], {k, 
       qo, (w^2 - MJpsi^2)/4}] + 
     0.118/qbar/qo*Log[(qbar + qo)/qbar]*
      NN* ((4*qbar)/((4*qbar - MJpsi^2) + w^2))^(-a)*(qo)^
       b*(2^(2*(deriv) + 3)/Sqrt[Pi]*
        Gamma[deriv + 5/2]/ Gamma[deriv + 4]))^2;

chisq5 := 
 Sum[((MasData5[[j]][[1]][[2]] - F5[MasData5[[j]][[1]][[1]]])/
     MasData5[[j]][[2]][[1]])^2, {j, 1, Length[MasData5]}];

rr = Minimize[chisq5, {a, b, NN}];

I called the derivative 'deriv' in the above and defined qbar and qo ahead. Thanks for your help.
 
Well, I'm not sure if I'm helping, but at least I got it to give a numeric answer. You need to make sure each of the functions gives a numeric (not symbolic) answer before NIntegrate and Minimize can deal with them. See if this helps. I was just putting in random values to test each function. You would know better than I what numbers make sense. Also, I just included two of the data points so it wouldn't take so long.

Code:
In[1]:= Needs["ErrorBarPlots`"]

In[2]:= MasData5={{{44.8,47.5},ErrorBar[4.0]},{{54.8,50.1},ErrorBar[4.2]},{{64.8,61.7},ErrorBar[5.1]},{{74.8,64.8},ErrorBar[5.5]},{{84.9,75},ErrorBar[6.2]},{{94.9,81.2},ErrorBar[6.7]},{{104.9,85.3},ErrorBar[7.1]},{{119.5,94.5},ErrorBar[7.5]},{{144.1,101.5},ErrorBar[8.3]},{{144.9,101.9},ErrorBar[10.9]},{{162.5,117.8},ErrorBar[12.8]},{{177.3,130.2},ErrorBar[13.4]},{{194.8,147.7},ErrorBar[17.1]},{{219.6,137.4},ErrorBar[20.1]},{{244.8,176.6},ErrorBar[20.3]},{{267.2,178.7},ErrorBar[21.1]},{{292.3,200.4},ErrorBar[29.1]},{{60,55.8},ErrorBar[4.838]},{{80,66.6},ErrorBar[7.280]},{{100,73.4},ErrorBar[6.426]},{{120,86.7},ErrorBar[7.245]},{{140,104},ErrorBar[12.083]},{{160,110},ErrorBar[16.279]},{{42.5,43.8},ErrorBar[3.482]},{{55,57.2},ErrorBar[3.980]},{{65,62.5},ErrorBar[4.614]},{{75,68.9},ErrorBar[5.197]},{{85,72.1},ErrorBar[5.523]},{{100,81.9},ErrorBar[5.368]},{{117.5,95.7},ErrorBar[6.277]},{{132.5,103.9},ErrorBar[6.912]},{{155,115},ErrorBar[7.920]},{{185,129.1},ErrorBar[9.192]},{{215,141.7},ErrorBar[10.666]},{{245,140.3},ErrorBar[14.526]},{{275,189},ErrorBar[24.274]},{{49,39.2},ErrorBar[10]},{{86,75.7},ErrorBar[14.414]},{{167,118},ErrorBar[22.828]},{{43.2,50.7},ErrorBar[1.5]},{{50,59.5},ErrorBar[1.4]},{{57.3,61.8},ErrorBar[1.9]},{{65.3,67.6},ErrorBar[1.7]},{{73.9,72.4},ErrorBar[1.9]},{{83.2,79.9},ErrorBar[2.3]},{{93.3,84.4},ErrorBar[2.1]},{{104.3,86.7},ErrorBar[2.7]},{{47.9,55.4},ErrorBar[2.1]},{{68.4,66.4},ErrorBar[2.9]}};
(*h1 2006 Q^2=0 data,zeus 2002,zeus 2004 and h1 2013 data for Q^2=0*)
In[3]:= gamma=5.55*^-6;
MJpsi=3.1;
alphaem=1/137;

In[6]:= xg=NN*((4*qbar)/((4*qbar-MJpsi^2)+w^2))^(-a)*(qbar)^b*Exp[Sqrt[16*Ca/9*Log[(4*qbar-MJpsi^2+w^2)/(4*qbar)]*Log[Log[qbar/lambda]/Log[qo/lambda]]]];
In[7]:= deriv=D[Log[xg],Log[1/(((4*qbar))/((4*qbar-MJpsi^2)+w^2))]]

Out[7]= (2 Ca Log[Log[qbar/lambda]/Log[qo/lambda]])/(3 Sqrt[Ca Log[(-9.61+4 qbar+w^2)/(4 qbar)] Log[Log[qbar/lambda]/Log[qo/lambda]]])
In[8]:= deriv1[ww_]:=deriv/.{Ca->3.0,qo->2.0,qbar->2.4025,lambda->0.09,w->ww};
In[9]:= deriv1[7.0]
Out[9]= 0.216839
In[10]:= deriv2 = D[(2^(2*(deriv)+3)/Sqrt[Pi]*Gamma[deriv+5/2]/Gamma[deriv+4])*NN*(((4*qbar))/((4*qbar-MJpsi^2)+w^2))^(-a)*(k)^b*Exp[Sqrt[16*Ca/9*Log[(4*qbar-MJpsi^2+w^2)/(4*qbar)]*Log[Log[k/lambda]/Log[qo/lambda]]]],k];
In[11]:= deriv3[ww_, aa_, bb_, NNN_, kk_] := deriv2/.{Ca->3.0,qo->2.0,qbar->2.4025, lambda->0.09, w->ww, a->aa, b->bb, NN->NNN, k->kk};
In[12]:= deriv3[1.0,2.0,3.0,4.0,5.0]
Out[12]= -1.05609+3.19444 I
In[13]:= gamma=5.55*^-6;
MJpsi=3.1;
alphaem=1/137;
lambda=0.09;
Ca=3;
qbar=2.4025;
qo=2;
alphas[k_]=4*Pi/9/Log[k/lambda];

In[21]:= alphas[7.0]
Out[21]= 0.320696
In[22]:= F5[w_, a_, b_, NN_]:=3.89379*^5*1/4.5/16*4*Pi^3*MJpsi^3*gamma/12/alphaem*(NIntegrate[alphas[k]/qbar/(qbar+k)*deriv3[w,a,b,NN,k],{k,qo,(w^2-MJpsi^2)/4}]+0.118/qbar/qo*Log[(qbar+qo)/qbar]*NN*((4*qbar)/((4*qbar-MJpsi^2)+w^2))^(-a)*(qo)^b*(2^(2*(deriv1[w])+3)/Sqrt[Pi]*Gamma[deriv1[w]+5/2]/Gamma[deriv1[w]+4]))^2;
In[23]:= F5[1.0,2.0,3.0,4.0]
During evaluation of In[23]:= NIntegrate::ncvb: NIntegrate failed to converge to prescribed accuracy after 9 recursive bisections in k near {k} = {0.0860216}. NIntegrate obtained 165912. -25668.6 I
and 169613.28983553138` for the integral and error estimates. >>
Out[23]= 3.40175*10^13-1.0784*10^13 I
In[24]:= chisq5[a_,b_,NN_]:=Sum[((MasData5[[j]][[1]][[2]]-F5[MasData5[[j]][[1]][[1]],a,b,NN])/MasData5[[j]][[2]][[1]])^2,{j,1,2}]
In[25]:= chisq5[.1,.2,.3]
Out[25]= 376033.
In[26]:= rr=Minimize[chisq5[a,b,NN],{a,b,NN}]
Out[26]:={1.50641*10^-10, {a -> -0.305193, b -> 0.112788, NN -> -0.630418}}!
 
phyzguy said:
Well, I'm not sure if I'm helping, but at least I got it to give a numeric answer. You need to make sure each of the functions gives a numeric (not symbolic) answer before NIntegrate and Minimize can deal with them. See if this helps. I was just putting in random values to test each function. You would know better than I what numbers make sense. Also, I just included two of the data points so it wouldn't take so long.
Thanks! I'm just trying to understand the change you made, however, that allowed the function to give a numeric answer? I see you made replacements of the form a->aa,b->bb,NN->NNN and k->kk. What does this replacement do?

I see that it returns best fit parameters for a,b,NN, but did you get the same errors as what I got in the attached pdf file page 3? (saved as pdf because the forums do not allow .nb extensions )
 

Attachments

CAF123 said:
Thanks! I'm just trying to understand the change you made, however, that allowed the function to give a numeric answer? I see you made replacements of the form a->aa,b->bb,NN->NNN and k->kk. What does this replacement do?

I see that it returns best fit parameters for a,b,NN, but did you get the same errors as what I got in the attached pdf file page 3? (saved as pdf because the forums do not allow .nb extensions )

It's a little tricky. On the one hand, you want the functions to give a numeric value so numeric functions like NIntegrate and Minimize can work with them. On the other hand, you want to do symbolic differentiation of the functions. You also need to understand the difference between a function defined by "=" and a function defined by ":=". A function defined by "=" will be evaluated immediately, while a function defined by ":=" will be defined, but not evaluated until called for. In this sense, a function defined by ":=" is like a method definition in a more conventional language like Python. So what I did was do the symbolic differentiation with deriv = ...,
and then define a numeric function with deriv1[ww_] := ... The "./" symbol means to replace every occurrence of one symbol with another, so "/. {Ca → 3.0, qo → 2.0, qbar → 2.4025, lambda → 0.09, w → ww}" replaces the symbol qbar with the numeric value 2.4025, and replaces the symbol w with the function argument ww, and so on.

Yes, I did get the same type of errors you did. Since it still returned an answer, I interpreted this to mean that the integrand was ill-defined over part of the region. Perhaps it has the log of a negative number or something like that. I'm really not sure. You might try exploring F5 function an see where these failures occur.

Hope this helps.
 
Two other thoughts that occurred to me. First, if you have some prior knowledge of reasonable values for a, b, and NN, introducing those constraints might eliminate the problem we were seeing and/or speed the minimization. Second, I see that Mathematica has a function NMinimize, which does the minimization numerically. Since you've already made the problem numeric by using NIntegrate, NMinimize might be a better choice.
 
  • #10
Thanks for your comments, I understood some of the replacements but what do we achieve by replacing, for example, w->ww? It's like we just renamed the argument of the function. Likewise for a->aa, etc.

Yup I tried the NMinimize and it gave a new set of values for chi square and the three parameters, allow I had to manually set the number of iterations for it to converge. However, it still has those errors I gave in that pdf.

I'm also interested in determining a covariance matrix from this analysis, providing uncertainty estimates on the parameters and their correlations. The code I wrote for such a procedure is here but it returns some peculiar errors. Do you happen to see what's going on here? If I ask too much, sorry :P

Basically I add this on after the minimisation of the chi square
Code:
Ucovinv = IdentityMatrix[3];
vecpar = {a, b, NN};
For[i = 1, i <= 3, i++,
  For[k = 1, k <= 3, k++,
   Ucovinv[[i]][[
     k]] = (1/2 D[chisq[a_, b_, NN_], vecpar[[i]], vecpar[[k]]] /.
      rr[[2]])]];
Ucov = Inverse[Ucovinv];
Ucov // MatrixForm

rr[[2]] just replaces the parameters a,b,NN with their best fit estimates where rr = Minimise[chisq[a,b,NN],{a,b,NN}] Thanks!
 
  • #11
CAF123 said:
Thanks for your comments, I understood some of the replacements but what do we achieve by replacing, for example, w->ww? It's like we just renamed the argument of the function. Likewise for a->aa, etc.

We did just rename the argument of the function. We have to somehow tell it that we want the same functional form, but to now interpret it as a delayed evaluation. Maybe there is an easier way to do this, but if so I don't know what it is. Look at the simple answer below if we don't do this. It returns a symbolic answer instead of a numeric answer, because it doesn't know to associate the argument of the new function with that variable. We could type in the function again with a new name, but this is easier.

On the other question, I'll try to look at it, but may not have time.

Code:
In[1]:= deriv = D[Exp[-w^2/qo],w]
Out[1]= -((2 E^(-(w^2/qo)) w)/qo)
In[2]:= deriv1[w_]:= deriv/.{qo->2.4}
In[3]:= deriv1[2.0]
Out[3]= -0.833333 E^(-0.416667 w^2) w
In[4]:= deriv1[ww_]:=deriv/.{qo->2.4, w->ww}
In[5]:= deriv1[2.0]
Out[5]= -0.314793
 
  • Like
Likes   Reactions: CAF123

Similar threads

  • · Replies 15 ·
Replies
15
Views
4K
  • · Replies 12 ·
Replies
12
Views
3K
Replies
1
Views
2K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 7 ·
Replies
7
Views
3K
  • · Replies 5 ·
Replies
5
Views
4K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 1 ·
Replies
1
Views
5K