建模随手记1---线性规划和numpy的练习使用


全文使用python代替相应软件代码

2.1 Matlab编程基础

1.1 m文件的应用

  1. 创建一个m文件
  2. 在新建的文件夹下编写代码(脚本文件),创建范德蒙特行列式。
    import numpy
    def Vandermonde(dim):
    	return np.matrix([[(i+1)**j for i in range(dim)] for j in range(dim)])
    

使用了python 的生成器来快速构建矩阵。

  1. 练习:计算 1+22+32+…+10002
    import numpy as np
    def exercise1(num):
        n = np.arange(1, num+1)
        n = n.reshape(1, num)
        return int(np.dot(n, n.T))
    

这里是用到了arange和reshape构建矩阵,首先由arange生成数组,之后使用reshape生成矩阵,arange左闭右开,第三个参数为步长。

1.2 总练习

1.2.1 蒙特卡罗方法求概率

  1. 一根一米长的木棍,随机截成三段,求这三段木棍能够成三角形的概率。

    求解:
    几何概型,转化为两个切割点落在这条线上的位置,根据两边之和大于第三边来判断是否构成三角形,通过,以上为一次实验,通过增加实验次数来逼近概率。

    def triangle(iteration_num):
        is_iter = 0
        for i in range(iteration_num):
            a = np.random.uniform()
            b = np.random.uniform(low=0, high=1-a)
            c = 1-a-b
            vectors = sorted([a, b, c])
            if vectors[0]+vectors[1] > vectors[2]:
                is_iter += 1
    	 return is_iter/iteration_num
    
    def test():
        for i in range(10000, 100001, 10000):
            print(triangle(i))
    

结果:

0.1962
0.19565
0.19583333333333333
0.1931
0.19284
0.19098333333333334
0.19424285714285713
0.1930125
0.19154444444444443
0.19188

所以概率约为0.19
本次练习使用到了uniform生成随机数,其参数为 low 左值,high 右值,size 形式(可用于生成矩阵,默认为None)

  1. 从52张扑克牌(除去大小王)中随机抽取三张,求这三张构成同花顺的概率。

    解题思路:
    如果有一个13×4的矩阵那么从中随机选取三个元素,满足列相同,行数相互差一即可。通过增加实验次数来逼近概率值。

    def poker(iteration_num):
        is_flush = 0
        for i in range(iteration_num):
            cards = []
            card_num = 0
            while card_num < 3:
                card = [0, 0]
                card[0] = int(np.random.uniform(low=1, high=14))
                card[1] = int(np.random.uniform(low=1, high=5))
                if card not in cards:
                    cards.append(card)
                    card_num += 1
            cards = sorted(cards, key=lambda x: x[0])
            if cards[0][1] == cards[1][1] and cards[2][1]:
                if cards[0][0] - cards[1][0] == -1 and cards[2][0] - cards[1][0] == 1:
                    is_flush += 1
        return is_flush / iteration_num
    def test():
        for i in range(10000, 100001, 10000):
            print(poker(i))
    
    

结果:

0.008
0.0079
0.007533333333333334
0.0076
0.00788
0.008216666666666667
0.008042857142857143
0.00815
0.007811111111111111
0.00821

计算概率约为0.008

2. Lingo编程基础

以下部分参考:https://www.jianshu.com/p/9be417cbfebb

1. 线性规划
求解最普通的线性规划问题:
$$
	minz=2x_{1}+3x_{2}+x_{3}
$$

{ x 1 + 4 x 2 + 2 x 3 ⩾ 8 3 x 1 + 2 x 2 ⩾ 6 x 1 , x 2 , x 3 ⩾ 0 \left\{\begin{matrix} & x_{1}+4x_{2} +2x_{3}\geqslant 8 \\ & 3x_{1}+2x_{2}\geqslant 6\\ & x_{1},x_{2},x_{3}\geqslant 0 \end{matrix}\right. x1+4x2+2x383x1+2x26x1,x2,x30

import numpy as np
from scipy import optmize

z = ([2, 3, 1])
A = np.array([1, 4, 2], [3, 2, 0])
b = np.array([8, 6])
x1_bound, x2_bound, x3_bound = (0, None)

res = optmize.linprog(z, A_ub=-A, b_ub=-b
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值