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
3、与 b1 很接近,即满足| a1 - b1 | ( |a1|+|b1| )则:我们要找的最小点是( Xm, f(Xm) ),结束搜索。否则:令 a=a1; b = b1 转(1 )在海湾战争中,美军曾使用地毯式轰炸,就是一种二维迈步法,又称网格法,亦称拉网法。迈步法是搜索法中最基本的方法,它非常有效,缺点是计算量大了一点。在量子化学计算中,X 计算方法就使用了这种方法( 我是从它的打印计算结果中分析出来的) 。例 1 : 求函数 的极小点。10)3()2xf#coding=gbk# 迈步法求函数 f(x) 在a,b的极小点#入口 :# f 模型函数# a,b 待优化参数的起始区间 a,bdef
4、 maibu( f , a , b ):n = 20while True:dx = (b-a)/nxmin = afmin = f(xmin) for i in range(1,n+1):xi = a+dx*ifi = f(xi)if fifmin:fmin = fixmin = xia= xmin - dxb= xmin + dxif 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),“)“
5、)极小值点:( 3.0 , 10.0 )7.2 求一元弱酸的 pH 值在分析化学中,我们已经学习过一元弱酸溶液的 pH 值的近似公式。CkH1在这里,我们试着用求极小值的方法去求解“精确”解,即不作近似。 AHkOw12电荷平衡: O根据分布系数知: 1*kHCAA所以: )1(1* HkwCHA要想直解求解方程(2)有点困难。我们构造模型函数: )2.(1*),1,( kkwfQHAHA将求解方程(2)的问题转化为求使用 Q 最小的H + ,即问题转化为求一元函数极小值的问题。说明:(2)式中 CHA, k1, kw 均为常数。例 2 求 0.01M HA( k1=1.8E-5)溶液的 pH
6、.#coding=gbk#求 0.01M HA( k1=1.8E-5)溶液的 pH#-# 迈步法求函数 f(x) 在a,b 的极小点#入口 :# f 模型函数# a,b 待优化参数的起始区间 a,bdef maibu( f , a , b ):n = 20while True:dx = (b-a)/nxmin = afmin = f(xmin) for i in range(1,n+1):xi = a+dx*ifi = f(xi)if fifmin:fmin = fixmin = xia= xmin - dxb= xmin + dxif abs(b-a)= 1E-5 *(abs(a)+abs(
7、b) ):return (a+b)/2KW = 1E-14C = 0.01K1 = 1.8E-5def f( pH ):H = 10*(-pH)OH = KW / HA = 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.0
8、001 0.00001M HA( k1=1.8E-5)溶液的 pH#-# 迈步法求函数 f(x) 在a,b 的极小点#入口 :# f 模型函数# a,b 待优化参数的起始区间 a,bdef maibu( f , a , b ):n = 20while True:dx = (b-a)/nxmin = afmin = f(xmin) for i in range(1,n+1):xi = a+dx*ifi = f(xi)if fifmin:fmin = fixmin = xia= xmin - dxb= xmin + dxif abs(b-a)= 1E-5 *(abs(a)+abs(b) ):ret
9、urn (a+b)/2KW = 1E-14C = 1.0K1 = 1.8E-5def f( pH ):H = 10*(-pH)OH = KW / HA = C *( K1/(H+K1)return ( H - (OH+A) )*2import mathfor i in range(1,6):C = C/10XP = maibu( f, 0, 14)XJS = - math.log10(math.sqrt(K1*C)#用近似公式计算的 pHH = 10*(-XP)HJS = 10*(-XJS)re = (HJS-H)/H*100.0 #相对误差print( “%7.5fM HA 的 pH =%1
10、0.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.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
11、 = 3.901 近似计算 pH = 3.8720.00100M HA 的H= 1.25E-04 近似计算H= 1.34E-04 相对误差= 6.93%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 计
12、算 0.1M NaHA(草酸氢钠 ) 溶液的 pH 值草酸氢钠的电荷平衡: *2 AHONaH上式中: 2*1* /1.022kHkCAHkw#coding=gbk# 计算 0.1M NaHA(草酸氢钠) 溶液的 pH 值# 已知 k1=0.0562 k2=5.248e-05#-# 迈步法求函数 f(x) 在a,b 的极小点#入口 :# f 模型函数# a,b 待优化参数的起始区间 a,bdef maibu( f , a , b ):n = 20while True:dx = (b-a)/nxmin = afmin = f(xmin) for i in range(1,n+1):xi = a+
13、dx*ifi = f(xi)if fifmin:fmin = fixmin = xia= xmin - dxb= xmin + dxif abs(b-a)= 1E-5 *(abs(a)+abs(b) ):return (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 (
14、 pH ):H = 10*(-pH )OH = KW/HHA = C * K1*H/( H*H + K1*H + K2*K1)A = C * K1*K2/( H*H + K1*H + K2*K1) 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
15、.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 = 2 ml混合后的分析浓度 2121VCNaOHaA电荷平衡: * ANaH式中 2*1* /22kHkCAHkwOCNaHAaO我们发现例 4 与例 3 的电荷平衡式是一样的,唯一不同的是 Na+的计算式略有不同。#coding=gbk#迈步法求 10ml 0.2M 草酸氢钠+2ml 0.02M NaOH 溶液的 pH# 计算求 10ml
16、 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 = 20while True:dx = (b-a)/nxmin = afmin = f(xmin) for i in range(1,n+1):xi = a+dx*ifi = f(xi)if fifmin:fmin = fixmin = xia= xmin - dxb= xmin + dxif abs(b-a)= 1E-5 *
17、(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)CNaOH = C2*V2/(V1+V2)CNa = CNaHA + CNaOH # Na+K1 = 0.0562K2 = 5.248e-05KW = 1E-14 #水的离子积#构造模型函数def f ( pH ):H = 10*(-pH )OH = KW/
18、HHA = 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.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
19、 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 NaOH 溶液的 pH# 已知 草酸的电离常数# k1=0.0562 k2=5.248e-05# 醋酸电离常数# k1-HAC = 1.8e-5#-#入口 :# f 模型函数# a,b 待优化参数的起始区间 a,bdef
20、 maibu( f , a , b ):n = 20while True:dx = (b-a)/nxmin = afmin = f(xmin) for i in range(1,n+1):xi = a+dx*ifi = f(xi)if fifmin:fmin = fixmin = xia= xmin - dxb= xmin + dxif abs(b-a)= 1E-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 # 草酸氢钠的初始浓度
21、 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.248e-05K_HAc = 1.8E-5KW = 1E-14 #水的离子积#构造模型函数def f ( pH ):H = 10*(-pH )OH = KW/HHA = CNaHA * K1*H/( H*H + K1*H + K2*K1)A
22、= 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 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
23、草酸氢钠+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 草酸氢钠+10ml 蒸馏水 + 2ml 0.02M NaOH 溶液的 pH# 已知 草酸的电离常数# k1=0.0562 k2=5.248e-05#-#入口 :# f 模型函数# a,b 待优化参数的起
24、始区间 a,bdef maibu( f , a , b ):n = 20while True:dx = (b-a)/nxmin = afmin = f(xmin) for i in range(1,n+1):xi = a+dx*ifi = f(xi)if fifmin:fmin = fixmin = xia= xmin - dxb= xmin + dxif 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 # 草酸氢
25、钠的初始浓度 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*(-pH )OH = KW/HHA = 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