查看原文
其他

Matlab被禁用,拿什么拯救?!


数学建模中,大学数人都在用Matlab,但是Matlab不算是一门正统的计算机编程语言,速度慢还收费。


更糟糕的是,迫于美国政策越来越多高校被禁用Matlab!



【根据美国商务部的通知,北京航空航天大学、中国人民大学、国防科技大学、湖南大学、哈尔滨工业大学、哈尔滨工程大学、西北工业大学、西安交通大学、电子科技大学、四川大学、同济大学、广东工业大学以及南昌大学等 13 所大学列入了禁用MATLAB的“实体名单”。】


形势所迫,没有Matlab的日子还是很难过的。但也不是完全寸步难行,仍然能找到很多替代工具。


随着Python中数学软件包的不断完善,其中有非常著名的科学计算三剑客库——numpy,scipy和matplotlib,三者基本代替Matlab的功能,完全能够应对数学建模任务。


01

为什么推荐你学Python


1、Python易学、易读、易维护,无需把数据库切割;


2、Python势头猛,除了数学建模以外,Python的应用领域更广,众多大公司需要,市场前景广阔,而Matlab语言比较局限,专注于工程和科学计算方面,收费且易受限制。


3、Python有丰富的扩展库,这是Matlab不能比的。


02

数学建模算法Python的实现


python除了丰富的原生数据结构外,拥有强大的第三方软件包支持——


例如矩阵运算库Numpy,数据处理库Pandas

机器学习库Sklearn、深度学习库Tenserflow&Pytorch

科学计算库Scipy、图形绘制库matplotlib

网络算法库Networkx


此外几乎针对任何领域,都有第三方软件包的支持,这归功于python优秀的社区。使用者需要使用好pip这一软件包管理工具,发掘前人造好的轮子,尽量减少自己编程的难度。


下面将介绍几种常见数学建模算法的python实现



1.数据拟合算法

我们这里介绍通过最小二乘法拟合线性函数


  1. #我们使用最小二乘法拟合一个三次函数,选取了5个参数

  2. import numpy as np

  3. import matplotlib.pyplot as plt

  4. SAMPLE_NUM = 100

  5. M = 5

  6. x = np.arange(0, SAMPLE_NUM).reshape(SAMPLE_NUM, 1) / (SAMPLE_NUM - 1) * 10

  7. y = 2*x**3+3*x**2+x+1

  8. plt.plot(x, y, 'bo')

  9. X = x

  10. for i in range(2, M + 1):

  11.    X = np.column_stack((X, pow(x, i)))

  12. X = np.insert(X, 0, [1], 1)

  13. W=np.linalg.inv((X.T.dot(X))).dot(X.T).dot(y)

  14. y_estimate = X.dot(W)

  15. plt.plot(x, y_estimate, 'r')

  16. plt.show()


2.插值算法
我们使用几种常见的插值函数拟合上例中的三次函数

  1. import numpy as np

  2. from scipy import interpolate

  3. import pylab as pl

  4. x=np.linspace(0,10,11)

  5. y=2*x**3+3*x**2+x+1

  6. xInset=np.linspace(0,10,101)

  7. pl.plot(x,y,"ro")

  8. for kind in["nearest","zero","slinear","quadratic","cubic"]:

  9.    f=interpolate.interp1d(x,y,kind=kind)

  10.    y_estimate=f(xInset)

  11.    pl.plot(xInset,y_estimate,label=str(kind))

  12. pl.legend(loc="lower right")

  13. pl.show()


3.线性规划算法
我们可以使用scipy库对目标函数进行线性规划

  1. import numpy as np

  2. from scipy.optimize import minimize

  3. def func(x):

  4. return(2*x[0]*x[1]+2*x[0]-x[0]**2+2*x[1]**2+np.sin(x[0]))

  5. cons=({"type":"eq","fun":lambda x:np.array([x[0]**3-x[1]]),"jac":lambda x:np.array([3*(x[0]**2),-1.0])},{"type":"ineq","fun":lambda x:np.array([x[1]-1]),"jac":lambda x:np.array([0,1])})#定义函数的多个约束条件

  6. res=minimize(func,[-1.0,1.0],constraints=cons,method="SLSQP",options={"disp":True})

  7. print(res)

注意这里求解的为目标函数最小值,如果我们需要求解最大值则将func取负数即可。输出内容如图




怕Matlab被禁???

千万别担心!

我们整理了所有数模常用算法的

Python  源代码(包含数据)



划重点:以上资料纯免费

 不需朋友圈集赞转发,直接领取

公众号回复“Python”即可获得全套资源


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存