晚上刚上完课,朋友就发来消息询问,如何用MATLAB求取不同情况下的最小值
聊天截图
具体的函数表达式
可以看出 EM 是一个由k 和p共同决定的二元函数,它是一个数学期望(这里省略了原题干,有兴趣的读者可在文章的末尾留言)
说实话,笔者并不熟悉 MATLAB 的相关操作,MATLAB 是一个商用的数学建模分析仿真软件,同时也是一门编程语言。但是求解这个最优化问题,我们完全可以用到我们在课堂上学到的 Python 知识.
程序在 Anaconda带的 dupyter notebook 中运行
def optimize(min_k,p):
EM_list = []
k_list = []
for k in range(min_k,min_k**2,1):
EM = 1 - k*(1-p)**k + k
EM_list.append(EM)
k_list.append(k)
min_value = min(EM_list)
index = EM_list.index(min_value)
best_k = k_list[index]
answer = [min_value, best_k]
return answer
optimize(10,0.0001)
运行的结果还不错,符合我们数学系高材生老沈的预期:
[1.0099955011997892, 10]
那我们接下来继续探索下去,找一找 minimum value of EM responding to the variation of p 的规律
result_list = []
p = 0.0001
while p <= 0.001:
result_list.append(optimize(10,p))
p += 0.0001
for i in range(0,9):
print(result_list[i])
The result of this coding block generally shows us the pattern, which is illustrated bellow:
[1.0099955011997892, 10]
[1.0199820095966388, 10]
[1.0299595323829926, 10]
[1.0399280767462624, 10]
[1.0498876498688219, 10]
[1.059838258928039, 10]
[1.0697799110962176, 10]
[1.0797126135406678, 10]
[1.0896363734236783, 10]
看起来,随着单个事件的概率上升(在该例中是群体发病概率),需要的分组检测次数 to identify the illness 会略有增加。其实在这个例子中都是 2 次。
好了,以上就是今天的分享~
谢谢您的阅读!