全文使用python代替相应软件代码
2.1 Matlab编程基础
1.1 m文件的应用
- 创建一个m文件
- 在新建的文件夹下编写代码(脚本文件),创建范德蒙特行列式。
import numpy def Vandermonde(dim): return np.matrix([[(i+1)**j for i in range(dim)] for j in range(dim)])
使用了python 的生成器来快速构建矩阵。
- 练习:计算 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 蒙特卡罗方法求概率
-
一根一米长的木棍,随机截成三段,求这三段木棍能够成三角形的概率。
求解:
几何概型,转化为两个切割点落在这条线上的位置,根据两边之和大于第三边来判断是否构成三角形,通过,以上为一次实验,通过增加实验次数来逼近概率。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)
-
从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+2x3⩾83x1+2x2⩾6x1,x2,x3⩾0
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