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