首页/文章/ 详情

利用Mathematica求博弈、优化问题,以及复杂公式化简

2年前浏览2150

很多博弈或者优化问题都可以归结为求某个函数的极值(最大值或者最小值),使用Mathematica可以方便地求解该问题,无论是解析解还是数值解。求解过程基本可以分为两步:   

1)原函数对自变量求一阶导并令其为0,然后求解方程。如果是多变量,就要对每个自变量求导并令其为0,然后联立求解;

2)原函数对自变量求二阶导(对于多变量,就是求海森矩阵的值),将第一步得出的解代入。如果二阶导大于0,那么就是极小值,如果二阶导小于0,那么就是极大值。


需要注意的事项是:如果第一步求得多个解,那么就需要将所有解代入原函数,然后比较哪个是真正的最大值或者最小值。


利用Mathematica求博弈、优化问题

以下以函数SigmaP为例:

其中,自变量为x和y。当函数比较复杂的没有解析解的,可以一样的数值求解,无非是用NSolve[]替换Solve[]。


SigmaP对x求导为:

由于该模型比较简化,所以此式比较简单。如果式子比较复杂可以加上Simplify[]命令化简。同样地,SigmaP对y求导为:

令dSigmaPdx=0求得:

令dSigmaPdy=0求得:

将x代入y,或者将y代入x均可求得x以及y,但是直接联立以上两个方程求解是更快的一种方法。


联立

dSigmaPdx=0

dSigmaPdy=0

求得:


可以看出有三组解,并且都非常复杂。可以用Simplify[]命令化简,但是非常慢,所以下边介绍一种不常用的方法。



复杂公式化简

我们观察到上图中有很多重复的项,所以可以对其做代换为(para1和para2可以替换成任意变量):

结果为:

我们发现又出现了一些新的重复项,再将其代换为(para111和para112可以替换成任意变量):

结果为:


此时可以看出公式已经相当简化了。这种简化了的公式是可以写进文章的,像之前那种有几百项的公式肯定是没办法的。



最后必须要将以上的解代入二阶导,才能确定解是原函数的最大值还是最小值。二阶导也可以做上面的代换:

最后,有相关需求欢迎联系我们.

vx:CAE320

公棕号:320科技工作室


Mathematica
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-03-20
最近编辑:2年前
320科技工作室
硕士 | 结构工程师 lammps/ms/vasp/
获赞 222粉丝 346文章 304课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈