【问题标题】:How to use the optimize.fmin function in python 2.7 with chemical reaction kinetics如何在 python 2.7 中使用具有化学反应动力学的 optimize.fmin 函数
【发布时间】:2017-08-05 15:30:51
【问题描述】:

我有一个任务是绘制两个连续的一阶反应, 然后找到反应 B 的最大浓度。

我已经设法绘制了三个函数的图表,我正在努力 找到最大值。我的老师告诉我使用optimize.fmin() (我想他想让我为反应 B 创建一个负函数, 并找到该函数的最小值,它应该是最大值。), 唯一的问题是它不起作用!

到目前为止,我已经为 optimize.fmin() 函数中的第二个参数尝试了除 0.75 以外的其他值。 我在哪里错了?我看到错误是说它期待一个数组但得到一个序列?这与t=linspace(0,tmax,20) 线有关吗 我为实验创建 20 个均匀间隔的点的代码,总运行时间为 20 分钟

%pylab inline
from matplotlib import *
from scipy import *


    k1 = 0.15
    k2 = 0.10
    A0 = 2
    tmax = 21
    t = linspace(0,tmax,20)

    e1= e**(-k1*t)
    e2= e**(-k2*t)


    def conc_A(t):
        A = A0 * e1
        return A

    def conc_B(t):
        B = A0 *(k1 / (k2-k1)) * (e1 - e2)
        return B

    def conc_C(t):
        C = (A0/ (k2-k1)) * (k2 * ((1 - e1 ))* - (k1 *(1-e2)))
        return C

pylab.plot(t,conc_A(t),label ='[A]')
plot(t,conc_B(t),label= '[B]')
plot(t,conc_C(t),label= '[C]')
pylab.legend(loc='upper right')
plt.xlabel("Time (minutes)" )
plt.ylabel("Concentration Mol $Dm^{-3}$")
plt.title("Rates of reaction of two consecutive first order reactions")


def neg_B(t):
    return -conc_B(t)

optimize.fmin(neg_B,0.75)

我得到的错误是

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-88-f481d0e274f9> in <module>()
     48 
     49 
---> 50 optimize.fmin(neg_B,0.75)
     51 
     52 

C:\Users\gsandle1\AppData\Local\Continuum\Anaconda2\lib\site-packages\scipy\optimize\optimize.py in fmin(func, x0, args, xtol, ftol, maxiter, maxfun, full_output, disp, retall, callback, initial_simplex)
    391             'initial_simplex': initial_simplex}
    392 
--> 393     res = _minimize_neldermead(func, x0, args, callback=callback, **opts)
    394     if full_output:
    395         retlist = res['x'], res['fun'], res['nit'], res['nfev'], res['status']

C:\Users\gsandle1\AppData\Local\Continuum\Anaconda2\lib\site-packages\scipy\optimize\optimize.py in _minimize_neldermead(func, x0, args, callback, maxiter, maxfev, disp, return_all, initial_simplex, xatol, fatol, **unknown_options)
    515 
    516     for k in range(N + 1):
--> 517         fsim[k] = func(sim[k])
    518 
    519     ind = numpy.argsort(fsim)

ValueError: setting an array element with a sequence.

【问题讨论】:

    标签: python numpy matplotlib scipy chemistry


    【解决方案1】:

    t 中获得更多分数,例如2000年,你可以通过找到出现最大值的数组的索引来找到最大值的时间。

    t = np.linspace(0,tmax,2000)
    #... rest of code
    print t[np.argmax(conc_B(t))] # prints 8.11
    

    如果你想使用optimize.fmin,我建议你先阅读the documentation。它指出第一个参数需要是一个函数。所以你需要提供一个应该最小化的函数。

    import numpy as np
    import scipy.optimize as optimize
    
    k1 = 0.15
    k2 = 0.10
    A0 = 2.
    tmax = 21
    
    e1= lambda t: np.exp(-k1*t)
    e2= lambda t: np.exp(-k2*t)
    
    conc_A = lambda t: A0 * e1(t)
    conc_B= lambda t: A0 *(k1 / (k2-k1)) * (e1(t) - e2(t))
    conc_C = lambda t: (A0/ (k2-k1)) * (k2 * ((1. - e1(t) ))* -(k1 *(1.-e2(t))))
    
    print optimize.fmin(lambda t: -conc_B(t),0.75)
    
    # Optimization terminated successfully.
    #         Current function value: -0.888889
    #         Iterations: 23
    #         Function evaluations: 46
    # [ 8.10930176]
    

    【讨论】:

      猜你喜欢
      • 2020-04-26
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多