scipy.optimize.minimize chi squared python
<p>So i am doing this assignment, where i am supposed to minimize the chi squared function. I saw someone doing this on the internet so i just copied it:</p>

<p><a href="https://stackoverflow.com/questions/13670333/multiple-variables-in-scipys-optimize-minimize">Multiple variables in SciPy&#39;s optimize.minimize</a></p>

<p>I made a chi-squared function which is a function in 3 variables (x,y,sigma) where sigma is random gaussian fluctuation random.gauss(0,sigma). I did not print that code here because on first sight it might be confusing (I used a lot of recursion). But i can assure you that this function is correct.</p>

<p>now this code just makes a list of the calculated minimization(Which are different every time because of the random gaussian fluctuation). But here comes the main problem. If i did my calculation correctly, we should get a list with a mean of 2 (since i have 2 degrees of freedom as you can see in this link: <a href="https://en.wikipedia.org/wiki/Chi-squared_test" rel="nofollow noreferrer">https://en.wikipedia.org/wiki/Chi-squared_test</a>). </p>

<pre><code>def Chi2(pos):
    return Chi(pos[0],pos[1],1) 

x_list= []
y_list= []  
chi_list = []
    for i in range(1000):
        result = scipy.optimize.minimize(Chi2,[5,5]).x
        x_list.append(result[0])
        y_list.append(result[1])
        chi_list.append(Chi2(result))
</code></pre>

<p>But when i use this code i get a list of mean 4, however if i add the method "Powell" i get a mean of 9!!</p>

<p>So my main question is, how is it possible these means are so different and how do i know which method to use to get the best optimization?</p>

<p>Because i think the error might be in my chisquare function i will show this one as well. The story behind this assignment is that we need to find the position of a mobile device and we have routers on the positions (0,0),(20,0),(0,20) and (20,20). We used a lot of recursion, and the graph of the chi_squared looked fine(it has a minimum on (5,5)</p>

<pre><code>def perfectsignal(x_m,y_m,x_r,y_r):
    return 20*np.log10(c / (4 * np.pi * f)) - 10 * np.log((x_m-x_r)**2 + (y_m-y_r)**2 + 2**2)

def signal(x_m,y_m,x_r,y_r,sigma):
    return perfectsignal(x_m,y_m,x_r,y_r) + random.gauss(0,sigma)

def res(x_m,y_m,x_r,y_r,sigma,sigma2):
    x = (signal(x_m,y_m,x_r,y_r,sigma) -   perfectsignal(x_m,y_m,x_r,y_r))/float(sigma2);
    return x

def Chi(x,y,sigma):
    return(res(x,y,0,0,sigma,1)**2+res(x,y,20,0,sigma,1)**2+res(x,y,0,20,sigma,1)**2+res(x,y,20,20,sigma,1)**2)
</code></pre>

<p>Kees</p>