微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scipy.odr 无法拟合指数函数

如何解决scipy.odr 无法拟合指数函数

我正在从事一个天体物理学项目,我需要通过两种方法(A 和 S)测量星系中心气体的密度 (ne)。我画了一个 ne_s x ne_a 的图,我想在这个图中尝试指数拟合。问题如下:

  1. 数据中的错误是不对称的,显然 scipy.odr 不接受这种类型的错误。当包含错误时,会引发“ValueError: Could not convert we to a合适的数组”。

  2. 即使我不包括错误,拟合仍然不起作用。

使用的代码(不包括拟合错误):

import numpy as np
import matplotlib.pyplot as plt

ne_s = np.array([ 134.70722125,316.27850769,403.37221974,579.91067991,1103.06258335,1147.23685549,115.00820933,476.42659337,667.61690967,403.30988606,282.08007264,479.98058352,897.64247885,214.75999934,213.22512064,491.81749573,743.68513419,374.37957281,362.136037,893.88595455])

dne_s_max = np.array([23.6619623,5.85802097,12.02456923,1.50211648,5.15987014,10.3830146,10.5274528,0.82928872,2.18586603,31.95014727,6.53134179,2.38392559,32.2838402,5.43629034,1.02316579,6.60281602,14.53943481,9.16809221,6.84052648,12.87655997])

dne_s_min = np.array([21.94513608,5.80578938,11.8303456,1.49856527,5.1265976,10.2523836,10.12663739,0.82824884,2.17914616,30.55846643,6.45691351,2.37446669,30.87025015,5.37271061,1.02087355,6.5358395,14.21332643,9.0523711,6.77187898,12.64596461])

ne_a = np.array([  890.61498788,2872.03715706,10222.33463389,1946.48193766,6695.25304235,2107.36471192,891.72010662,3988.87511761,11328.9670489,1097.38904905,2896.62668843,4849.57809801,5615.96780935,1415.18564794,1204.00022768,3616.05423907,15638.52683391,3300.6039601,775.28841051,12325.54379524])

dne_a_max = np.array([1082.33639266,571.57094375,2396.39839075,458.32058555,796.79916236,665.95370946,2262.73423374,1006.65192577,1761.9251987,1718.78400914,579.65477159,245.54811362,1652.50314639,401.37677822,178.03620792,725.26490794,6625.62353545,908.21490446,719.01117673,2098.24809312])

dne_a_min = np.array([ 865.33019015,518.08880981,1877.85283954,412.91242092,724.38681574,582.52644162,870.14392196,866.63643893,1478.1792513,1076.64135559,521.08794554,236.2457763,1349.36104495,362.72343267,169.23314057,646.39803115,4139.5768453,789.04878324,620.55523654,1720.06369942])
dne_a = [dne_a_min,dne_a_max]
dne_s = [dne_s_min,dne_s_max]

fig,ax = plt.subplots(1,1)
ax.errorbar(ne_s,ne_a,xerr = dne_s,yerr = dne_a,linestyle = 'none',linewidth = 0.7,capsize = 5,color = 'crimson')
ax.scatter(ne_s,s = 15,color = 'black')
ax.set_ylabel('$n_e(A)$'),ax.set_xlabel('$n_e(S)$')

from scipy.odr import Data,RealData,Model,ODR

def f(B,x):
    return B[0] + B[1] * np.exp(B[2] * x)

exponential = Model(f)
data = RealData(ne_s,ne_a)
odr = ODR(data,exponential,beta0=[1,200,3e-3])
out = odr.run()

ax.plot(ne_s,f(out.beta,ne_s),linewidth = 0.7)

结果:

ne_s_x_ne_a_fit

实际情节是:

ne_s_x_ne_a

那么我在这里错过了什么?我是否错误地应用了 odr 例程?我应该怎么做才能使拟合正常工作?以及如何让 scipy.odr 接受不对称错误

重要的是,我对 scipy.odr 不太了解,我只是将文档示例改编为指数函数

感谢您的帮助。如果需要更多信息,请告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。