我无法使用brentq
函数迭代数组的每个元素。下面定义的函数中的q
是一个FITS文件数组,我们使用此数组中的每个元素作为输入来运行brentq
函数以求解T
。
基本上,我的问题在于并不是特别知道在哪里或如何实现适当的for
循环来迭代q
的每个元素上的函数。
有关如何解决此问题的任何建议?
def f(T,q,coeff1,coeff2,coeff3):
return q*const3 - ((exp(const2/T)-1)/(exp(const/T)-1))
a = brentq(f, 10, 435.1, args=(q,4351.041,4262.570,0.206))
print a
newhdu = fits.PrimaryHDU(a)
newhdulist = fits.HDUList([newhdu])
newhdulist.writeto('Temp21DCOT.fits')
进一步说明:我尝试做的事情的基础是使用brentq
使用我们的初始数组(我们的FITS文件)的强度值来求解温度值)。
该等式是从普朗克方程的两个波长的比率得出的,所以q = B_1/B_2
如果我们想要对物理真实,q
中的每个元素都是强度值。对于brentq
中的每个元素,T
将为q
(温度)求解这个分析上无法解决的等式,并创建一个与q
大小相同的新温度数组。换句话说,我正在尝试使用Plank公式解决FITS文件中每个像素的温度。
注意:我重新发布此内容以更有效地澄清问题。
答案 0 :(得分:0)
您是否遇到迭代问题或效率问题?
此迭代适用于我:
In [485]: from scipy import optimize
In [486]: def f(T,q,coeff1,coeff2,coeff3):
return q*coeff3 - ((np.exp(coeff2/T)-1)/(np.exp(coeff1/T)-1))
# corrected the coeff use
In [487]: q=np.linspace(1,3,10)
# q range chosen to avoid the different signs ValueError
In [488]: A=[optimize.brentq(f, 10, 435.1, args=(i,4351.041,4262.570,0.206),full_output=True) for i in q]
In [489]: A
Out[489]:
[(55.99858839149886, <scipy.optimize.zeros.RootResults at 0xa861284c>),
(64.14621536172528, <scipy.optimize.zeros.RootResults at 0xa861286c>),
(72.98658083834341, <scipy.optimize.zeros.RootResults at 0xa861288c>),
(82.75638321495505, <scipy.optimize.zeros.RootResults at 0xa86128ac>),
(93.73016750496367, <scipy.optimize.zeros.RootResults at 0xa86128cc>),
(106.25045004489637, <scipy.optimize.zeros.RootResults at 0xa86128ec>),
(120.76612665626851, <scipy.optimize.zeros.RootResults at 0xa861290c>),
(137.88917389176325, <scipy.optimize.zeros.RootResults at 0xa861292c>),
(158.4854607193551, <scipy.optimize.zeros.RootResults at 0xa861294c>),
(183.82941862839408, <scipy.optimize.zeros.RootResults at 0xa861296c>)]
In [490]: [a[1].iterations for a in A]
Out[490]: [8, 9, 10, 10, 10, 10, 10, 9, 8, 10]
在brentq
文档f
中为一组args
返回一个值。有一些解算器,例如ode
个,可以定义一个采用向量变量的函数,并返回一个匹配的向量导数。它看起来不像这个root查找器允许的那样。所以你不得不迭代args
值,并解决每个案例。我把迭代写成列表理解。其他迭代格式也是可能的(对于循环等)。我们甚至可以将这个brentq
调用包装在可以通过np.vectorize
传递的函数中。但这仍然是一个节省时间很少的迭代。
处理多维数组有多种方法。一个简单的方法是flatten
输入,进行1d迭代,然后重新整形结果。例如:
In [517]: q1=q.reshape(2,5)
In [518]: q1
Out[518]:
array([[ 1. , 1.22222222, 1.44444444, 1.66666667, 1.88888889],
[ 2.11111111, 2.33333333, 2.55555556, 2.77777778, 3. ]])
In [519]: np.array([optimize.brentq(f, 10, 435.1, args=(i,4351.041,4262.570,0.206)) for i in q1.flat]).reshape(q1.shape)
Out[519]:
array([[ 55.99858839, 64.14621536, 72.98658084, 82.75638321,
93.7301675 ],
[ 106.25045004, 120.76612666, 137.88917389, 158.48546072,
183.82941863]])
我遗漏了full_output
标志,因为这会增加复杂性。