こんにちは。
今私は実験で得たデータを解析するためにpython,scipyでフィッティングを行い、エラーの値も含めて算出したいと考えています。

元となるデータはxy平面にプロットした点のx,y座標のリスト

Epsilon_list = [e1, e2, e3, ... , e14]
G_list = [g1, g2, g3, ... , g14]

フィッティングに用いる関数はxを変数、M1,M2を定数として

def M_fitfunc(x, M1, M2):
    return (1 - 2*x)**(5/2) * (M1 + M2*x)

と設定しました。

実際にフィッティングした過程と結果は以下の通りです。M_para_optは最適解、M_covは共分散を示すようです。

M_para_opt, M_cov = scipy.optimize.curve_fit(M_fitfunc, Epsilon_list, G_list)

M_para_opt = array([ 133.45631973, -149.65607315])
M_cov = array([[   5.95002727,   93.90321683],
       [  93.90321683, 1498.93958525]])

最適解となるM1,M2を求めることには成功したようですが、M1,M2それぞれのエラーの値をどう求めればよいのかわかりません。scipyの公式ドキュメントによると、

np.sqrt(np.diag(M_cov))

つまり、M_covという2行2列のマトリックスの対角成分の平方根がM1,M2それぞれのエラーに相当するようですが、ここでわからない点がいくつかあります。

1.なぜ共分散がエラーの値として正しいのか
2.そもそも共分散(M_cov)が行列として表現されるのはなぜか
3.一般的に分散の平方根=標準偏差だが、この行列の中の対角成分が共分散だとして、非対角成分は何を表しているのか

以上3点について、教えていただきたいと思います。よろしくお願いします。