1、 第7章 一元函数极小值 7.1最优化方法简介 一、最优化方法 在给定条件下,尽你尽你力所能及地得出最好的解的方法称为最优化方法。 最优化方法解决问题的一般步骤是: 1. 构造一个数学模型 Q = f ( x1,x2,x3,..... xn) 应确保构造的模型有极小值。 2. 找出使 Q 最小的自变量 x1,x2, ..., xn . 如果 自变量只有一个, 即Q = f( x ) , 则此时称为一元函数的最优化。下面我们只讨论一元函数的最优化问题。 二、求解一元函数最优化问题的求导数方法 如果f(x) 可以写出解析式,并且
2、可以求导数, 设 x* 处是极化小值,则有 f'(x*)=0 f''( x* ) < 0 遗憾的是现实中, 我们导出的数据模型,很难求导数。 三、求解一元函数最优化问题的搜索方法 求解一元函数最优化问题的搜索方法分为全面搜索法和逐步搜索法。 如果要求解 "对于 f(x) 在区间 [a,b] 上的极小点 x* ", 要求相对精度 ε=10E-5 则: | x计算 - x* | < ε ( |x计算|+|x*| ) 我们此处仅介绍全面搜索法。 全面搜索法(也叫迈步法) 全面搜索法的计算方案: (1
3、) 将区间 [a,b] 分成 n 等份,每份长度dx=(b-a)/n在每个分点上计算函数值,可以知道函数在哪个分点上的值最小,设为 Xmin。 (2) 新的求解区间为 [Xm-dx, Xm+dx],记为[ a1, b1 ] (3) 如果 a1与b1很接近,即满足 | a1 - b1 | < ε ( |a1|+|b1| ) 则: 我们要找的最小点是( Xm, f(Xm) ),结束搜索。 否则: 令 a=a1; b = b1 转(1) 在海湾战争中,美军
4、曾使用地毯式轰炸,就是一种二维迈步法,又称网格法,亦称拉网法。 迈步法是搜索法中最基本的方法,它非常有效,缺点是计算量大了一点。在量子化学计算中,Xα计算方法就使用了这种方法( 我是从它的打印计算结果中分析出来的)。 例1 : 求函数 的极小点。 #coding=gbk # 迈步法求函数f(x) 在[a,b]的极小点 #入口 : # f 模型函数 # a,b 待优化参数的起始区间 [a,b] def maibu( f , a , b ): n = 20 while True: dx = (b-a)/n xm
5、in = a
fmin = f(xmin)
for i in range(1,n+1):
xi = a+dx*i
fi = f(xi)
if fi 6、rn (a+b)/2
def f( x ):
return (x-3)**2+10
xp =maibu(f, -1000,1000)
print("极小值点:(",xp,",",f(xp),")")
极小值点:( 3.0 , 10.0 )
7.2 求一元弱酸的pH值
在分析化学中,我们已经学习过一元弱酸溶液的pH值的近似公式。
在这里,我们试着用求极小值的方法去求解“精确”解,即不作近似。
电荷平衡:
根据分布系数知:
所以:
要想直解求解方程(2)有点困难。
我们构造模型函数:
将求解方程(2)的问 7、题转化为求使用Q最小的[H+] ,即问题转化为求一元函数极小值的问题。说明:(2)式中 CHA, k1, kw 均为常数。
例2求0.01M HA( k1=1.8E-5)溶液的pH.
#coding=gbk
#求0.01M HA( k1=1.8E-5)溶液的pH
#----------------------------------
# 迈步法求函数f(x) 在[a,b]的极小点
#入口 :
# f 模型函数
# a,b 待优化参数的起始区间 [a,b]
def maibu( f , a , b ):
n = 20
while Tr 8、ue:
dx = (b-a)/n
xmin = a
fmin = f(xmin)
for i in range(1,n+1):
xi = a+dx*i
fi = f(xi)
if fi 9、 *(abs(a)+abs(b) ):
return (a+b)/2
KW = 1E-14
C = 0.01
K1 = 1.8E-5
def f( pH ):
H = 10**(-pH)
OH = KW / H
A = C *( K1/(H+K1))
return ( H - (OH+A) )**2
XP = maibu( f, 0, 14)
print( "0.01M HA的pH=", XP)
0.01M HA的pH= 3.381574
下面我们研究用近似公式和精确解进行比较,依次计算 0.1 、 10、0.01、0.001、0.0001、0.00001M的HA溶液的pH值。
#coding=gbk
#求0.1 0.01 0.001 0.0001 0.00001M HA( k1=1.8E-5)溶液的pH
#----------------------------------
# 迈步法求函数f(x) 在[a,b]的极小点
#入口 :
# f 模型函数
# a,b 待优化参数的起始区间 [a,b]
def maibu( f , a , b ):
n = 20
while True:
dx = (b-a)/n
11、xmin = a
fmin = f(xmin)
for i in range(1,n+1):
xi = a+dx*i
fi = f(xi)
if fi 12、turn (a+b)/2
KW = 1E-14
C = 1.0
K1 = 1.8E-5
def f( pH ):
H = 10**(-pH)
OH = KW / H
A = C *( K1/(H+K1))
return ( H - (OH+A) )**2
import math
for i in range(1,6):
C = C/10
XP = maibu( f, 0, 14)
XJS = - math.log10(math.sqrt(K1*C))#用近似公式计算的pH
H = 10** 13、XP)
HJS = 10**(-XJS)
re = (HJS-H)/H*100.0 #相对误差
print( "%7.5fM HA的pH =%10.3f 近似计算pH =%10.3f" %(C,XP,XJS))
print( "%7.5fM HA的[H]=%10.2E 近似计算[H]=%10.2E 相对误差=%7.2f%%" %(C,H,HJS,re))
0.10000M HA的pH = 2.875 近似计算pH = 2.872
0.10000M HA的[H]= 1.33E-03 近似计算[H]= 1.34E 14、03 相对误差= 0.67%
0.01000M HA的pH = 3.382 近似计算pH = 3.372
0.01000M HA的[H]= 4.15E-04 近似计算[H]= 4.24E-04 相对误差= 2.14%
0.00100M HA的pH = 3.901 近似计算pH = 3.872
0.00100M HA的[H]= 1.25E-04 近似计算[H]= 1.34E-04 相对误差= 6.93%
0.00010M HA的pH = 4.464 近似计算pH = 4.372
0.00010M 15、 HA的[H]= 3.44E-05 近似计算[H]= 4.24E-05 相对误差= 23.44%
0.00001M HA的pH = 5.145 近似计算pH = 4.872
0.00001M HA的[H]= 7.16E-06 近似计算[H]= 1.34E-05 相对误差= 87.47%
这个结果告诉我们,当弱酸的浓度比较大时,近似计算公式还是可以用的。
例3 计算0.1M NaHA(草酸氢钠) 溶液的pH值
草酸氢钠的电荷平衡:
上式中:
#coding=gbk
# 计算0.1M NaHA(草酸氢钠) 溶液的pH值
# 已知 16、 k1=0.0562 k2=5.248e-05
#----------------------------------
# 迈步法求函数f(x) 在[a,b]的极小点
#入口 :
# f 模型函数
# a,b 待优化参数的起始区间 [a,b]
def maibu( f , a , b ):
n = 20
while True:
dx = (b-a)/n
xmin = a
fmin = f(xmin)
for i in range(1,n+1):
17、 xi = a+dx*i
fi = f(xi)
if fi 18、 2[A] -[OH]) ^ 2
# k1=0.0562 k2=5.248e-05
C = 0.1 # H2Ac的分析浓度 (草酸氢钠)
CNa = C # [Na+]
K1 = 0.0562
K2 = 5.248e-05
KW = 1E-14 #水的离子积
#构造模型函数
def f ( pH ):
H = 10**(-pH )
OH = KW/H
HA = C * K1*H/( H*H + K1*H + K2*K1)
A = C * K1*K2/( H*H + K1*H + K2*K1)
19、 return ( H +CNa - HA - OH - 2*A ) ** 2
XP = maibu( f, 0, 14)
print( "计算0.1M NaHA(草酸氢钠) 溶液的pH值")
print( "已k1=0.0562 k2=5.248e-05")
print( "pH=", "%7.3f" % XP)
计算0.1M NaHA(草酸氢钠) 溶液的pH值
已k1=0.0562 k2=5.248e-05
pH= 2.867
例4 计算10ml 0.1M NaHA(草酸氢钠) 溶液+ 2ml 0.01 M NaOH 溶 20、液的pH值
分析:
混合前草酸氢钠 C1 =0.1 M , V1 = 10 ml
NaOH C2 =0.01 M , V2 = 2 ml
混合后的分析浓度
电荷平衡:
式中
我们发现例4与例3的电荷平衡式是一样的,唯一不同的是 [Na+]的计算式略有不同。
#coding=gbk
#迈步法求10ml 0.2M草酸氢钠+2ml 0.02M NaOH溶液的pH
# 计算求10ml 0.1M草酸氢钠+2ml 0.01M NaOH溶液的pH
# 已知 k1=0.0562 k2=5.248e-05
# 21、三分法求函数f的极小点的x值
#入口 :
# f 模型函数
# a,b 待优化参数的起始区间 [a,b]
def maibu( f , a , b ):
n = 20
while True:
dx = (b-a)/n
xmin = a
fmin = f(xmin)
for i in range(1,n+1):
xi = a+dx*i
fi = f(xi)
if fi 22、 fmin = fi
xmin = xi
a= xmin - dx
b= xmin + dx
if abs(b-a)<= 1E-5 *(abs(a)+abs(b) ):
return (a+b)/2
# 模型函数 Q = ([H] + [Na] - [HA] - 2[A] -[OH]) ^ 2
# k1=0.0562 k2=5.248e-05
C1 = 0.1 # 草酸氢钠的初始浓度
V1 = 10
C2 = 0.01 # NaO 23、H的初始浓度
V2 = 2
#混合后
CNaHA = C1*V1/(V1+V2)
CNaOH = C2*V2/(V1+V2)
CNa = CNaHA + CNaOH # [Na+]
K1 = 0.0562
K2 = 5.248e-05
KW = 1E-14 #水的离子积
#构造模型函数
def f ( pH ):
H = 10**(-pH )
OH = KW/H
HA = CNaHA * K1*H/( H*H + K1*H + K2*K1)
A = CNaHA * K1*K2/( H*H + K1*H 24、 K2*K1)
return ( H +CNa - HA - OH - 2*A ) ** 2
XP = maibu( f, 0, 14)
print( "计算10ml 0.1M草酸氢钠+2ml 0.01M NaOH溶液的pH")
print( "已k1=0.0562 k2=5.248e-05")
print( "pH=", "%7.3f" % XP)
计算10ml 0.1M草酸氢钠+2ml 0.01M NaOH溶液的pH
已k1=0.0562 k2=5.248e-05
pH= 2.998
例5:求10ml 0.1M草酸 25、氢钠+10ml 0.1M 醋酸 + 2ml 0.02M NaOH溶液的pH
已知 草酸的电离常数
k1=0.0562 k2=5.248e-05
醋酸电离常数
k1-HAC = 1.8e-5
#coding=gbk
#迈步法求10ml 0.1M草酸氢钠+10ml 0.1M 醋酸 + 2ml 0.02M NaOH溶液的pH
# 已知 草酸的电离常数
# k1=0.0562 k2=5.248e-05
# 醋酸电离常数
# k1-HAC = 1.8e-5
#----------- 26、
#入口 :
# f 模型函数
# a,b 待优化参数的起始区间 [a,b]
def maibu( f , a , b ):
n = 20
while True:
dx = (b-a)/n
xmin = a
fmin = f(xmin)
for i in range(1,n+1):
xi = a+dx*i
fi = f(xi)
27、 if fi 28、 草酸氢钠的初始浓度
V1 = 10
C2 = 0.01 # NaOH的初始浓度
V2 = 2
C3 = 0.1 # 醋酸的初始浓度
V3 = 10
#混合后
CNaHA = C1*V1/(V1+V2+V3)
CNaOH = C2*V2/(V1+V2+V3)
CHAc = C3*V3/(V1+V2+V3)
CNa = CNaHA + CNaOH # [Na+]
K1 = 0.0562
K2 = 5.248e-05
K_HAc = 1.8E-5
KW = 1E-14 #水的离子积
#构造模型函数
def f 29、 pH ):
H = 10**(-pH )
OH = KW/H
HA = CNaHA * K1*H/( H*H + K1*H + K2*K1)
A = CNaHA * K1*K2/( H*H + K1*H + K2*K1)
Ac = CHAc * ( K_HAc/( H + K_HAc) )
return ( H +CNa - HA - OH - 2*A - Ac ) ** 2
XP = maibu( f, 0, 14)
print( "计算10ml 0.1M草酸氢钠+10ml 0.1M 醋酸 + 2ml 30、0.02M NaOH溶液的pH")
print( "已知k1=0.0562 k2=5.248e-05")
print( "已知k_HAc=1.8E-5")
print( "pH=", "%7.3f" % XP)
计算10ml 0.1M草酸氢钠+10ml 0.1M 醋酸 + 2ml 0.02M NaOH溶液的pH
已知k1=0.0562 k2=5.248e-05
已知k_HAc=1.8E-5
pH= 2.966
例6:计算10ml 0.1M草酸氢钠+10ml 蒸馏水 + 2ml 0.02M NaOH溶液的pH。
为了与例对比,我们用蒸馏水代替醋酸试一下 31、结果会怎样?
#coding=gbk
#迈步法求10ml 0.1M草酸氢钠+10ml 蒸馏水 + 2ml 0.02M NaOH溶液的pH
# 已知 草酸的电离常数
# k1=0.0562 k2=5.248e-05
#------------------------------------------------------------
#入口 :
# f 模型函数
# a,b 待优化参数的起始区间 [a,b]
def maibu( f , a , b ):
n = 20
while True:
d 32、x = (b-a)/n
xmin = a
fmin = f(xmin)
for i in range(1,n+1):
xi = a+dx*i
fi = f(xi)
if fi 33、b) ):
return (a+b)/2
# 模型函数 Q = ([H] + [Na] - [HA] - 2[A] -[OH]) ^ 2
# k1=0.0562 k2=5.248e-05
C1 = 0.1 # 草酸氢钠的初始浓度
V1 = 10
C2 = 0.01 # NaOH的初始浓度
V2 = 2
V3 = 10
#混合后
CNaHA = C1*V1/(V1+V2+V3)
CNaOH = C2*V2/(V1+V2+V3)
CNa = CNaHA + CNaOH # [Na+]
K1 = 0. 34、0562
K2 = 5.248e-05
KW = 1E-14 #水的离子积
#构造模型函数
def f ( pH ):
H = 10**(-pH )
OH = KW/H
HA = CNaHA * K1*H/( H*H + K1*H + K2*K1)
A = CNaHA * K1*K2/( H*H + K1*H + K2*K1)
return ( H +CNa - HA - OH - 2*A ) ** 2
XP = maibu( f, 0, 14)
print( "计算10ml 0.1M草酸氢钠+10ml 蒸馏水 + 2ml 0.02M NaOH溶液的pH")
print( "已知 k1=0.0562 k2=5.248e-05")
print( "pH=", "%7.3f" % XP)
计算10ml 0.1M草酸氢钠+10ml 蒸馏水 + 2ml 0.02M NaOH溶液的pH
已知 k1=0.0562 k2=5.248e-05
pH= 3.048
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818