数学建模入门
数学模型
(1)原型与模型
模型是原型的替代物。(对原型提炼构造。)
模型不是原型,既简单于原型又高于原型。
模型的分类
数学模型是对特定对象,特定目的,根据特有的内在规律,做出一些必要的假设,运用数学工具,得到的近似数学结构。
模型是死的,模型优化是活的。
建模的十大算法
1.蒙特卡罗算法
构造或描述概率过程
实现从已知概率分布抽样
建立各种估计量
1分子模拟计算
使用蒙特·卡罗方法进行分子模拟计算是按照以下步骤进行的:
1. 使用随机数发生器产生一个随机的分子构型。
2. 对此分子构型的其中粒子坐标做无规则的改变,产生一个新的分子构型。
3. 计算新的分子构型的能量。
4. 比较新的分子构型于改变前的分子构型的能量变化,判断是否接受该构型。
2采用蒙特卡罗方法进行风险决策分析
确定影响该项目的7个主要风险变量
确定每个风险变量的概率分布(采用“德尔菲法”估计出以上 7 个风险变量概率分布和其分布函)
当不知道随机变量的概率模型服从那个分布时,可以使用均匀分布来构造;各种测量的误差、射击命中率、人的身高与体重等服从正态分布;指数分布可用在排队论与可靠性分析中;泊松分布可用在产品检验、排队系统、物理等领域中。
3MCMC:这是直接应用蒙特卡洛模拟方法的推广,该方法中随机数的产生是采用的马尔科夫链形式。
4蒙特卡洛积分:利用随机数列计算积分,维数越高,积分效率越高。
unifrnd可以创建随机的连续均匀分布的数组。
1.R = unifrnd(A,B)从x到y产生区间[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9],[9.10].然后从每个区间产生一个随机数,得到R。
.R = unifrnd(A,B,M,N,…) or R = unifrnd(A,B,[M,N,…])
像是撒点然后判断在计算
数学计算实例
https://blog.csdn.net/qq_41598072/article/details/85394010
https://blog.csdn.net/Yelbosh/article/details/8557749
多项式拟合
p=polyfit(x,y,n)
X,y为样本向量,n为最高阶次。
Python数据拟合
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(300,400,20)
y = x + np.random.random_integers(5,20,20) #随机取5到10中间20个数
poly = np.polyfit(x,y,deg=1)
z = np.polyval(poly, x)
plt.plot(x, y, 'o')
plt.plot(x, z)
plt.show()
# -*- coding: cp936 -*-
import math
import random
import matplotlib.pyplot as plt
import numpy as np
'''
在x=[0,1]上均匀采样10个点组成一个数据集D=[a,b]
'''
a = []
b = []
x=0
def func(x):
mu=0
sigma=0.1
epsilon = random.gauss(mu,sigma) #高斯分布随机数
return np.sin(2*np.pi*x)+epsilon
for i in range(0,10):
x=x+1.0/11.0
a.append(x)
b.append(func(x))
#定义输出矩阵函数
def print_matrix( info, m ):
i = 0; j = 0; l = len(m)
print info
for i in range( 0, len( m ) ):
for j in range( 0, len( m[i] ) ):
if( j == l ):
print ' |',
print '%6.4f' % m[i][j],
print
print
#定义交换变量函数
def swap( a, b ):
t = a; a = b; b = t
#定义线性方程函数,高斯消元法
def solve( ma, b, n ):
global m; m = ma # 这里主要是方便最后矩阵的显示
global s;
i = 0; j = 0; row_pos = 0; col_pos = 0; ik = 0; jk = 0
mik = 0.0; temp = 0.0
n = len( m )
# row_pos 变量标记行循环, col_pos 变量标记列循环
while( ( row_pos < n ) and( col_pos < n ) ):
# 选主元
mik = - 1
for i in range( row_pos, n ):
if( abs( m[i][col_pos] ) > mik ):
mik = abs( m[i][col_pos] )
ik = i
if( mik == 0.0 ):
col_pos = col_pos + 1
continue
# 交换两行
if( ik != row_pos ):
for j in range( col_pos, n ):
swap( m[row_pos][j], m[ik][j] )
swap( m[row_pos][n], m[ik][n] );
try:
# 消元
m[row_pos][n] /= m[row_pos][col_pos]
except ZeroDivisionError:
# 除零异常 一般在无解或无穷多解的情况下出现……
return 0;
j = n - 1
while( j >= col_pos ):
m[row_pos][j] /= m[row_pos][col_pos]
j = j - 1
for i in range( 0, n ):
if( i == row_pos ):
continue
m[i][n] -= m[row_pos][n] * m[i][col_pos]
j = n - 1
while( j >= col_pos ):
m[i][j] -= m[row_pos][j] * m[i][col_pos]
j = j - 1
row_pos = row_pos + 1; col_pos = col_pos + 1
for i in range( row_pos, n ):
if( abs( m[i][n] ) == 0.0 ):
return 0
return 1
matrix_A=[] #将系数矩阵A的所有元素存到a[n-1][n-1]中
matrix_b=[]
X=a
Y=b
N=len(X)
M=3 #对于题目中要求的不同M[0,1,3,9]值,需要在这里更改,然后重新编译运行
#计算线性方程组矩阵A的第[i][j]个元素A[i][j]
def matrix_element_A(x,i,j,n):
sum_a=0
for k in range(0,n):
sum_a = sum_a+pow(x[k],i+j-2) #x[0]到x[n-1],共n个元素求和
return sum_a
for i in range(0,M+1):
matrix_A.append([])
for j in range(0,M+1):
matrix_A[i].append(0)
matrix_A[i][j] = matrix_element_A(X,i+1,j+1,N)
#计算线性方程组矩阵b的第[i]行元素b[i]
def matrix_element_b(x,y,i,n):
sum_b=0
for k in range(0,n):
sum_b=sum_b+y[k]*pow(x[k],i-1) #x[0]到x[n-1],共n个元素求和
return sum_b
for i in range(0,M+1):
matrix_b.append(matrix_element_b(X,Y,i+1,N))
#函数matrix_element_A_()用来求扩展矩阵A_,array_A表示系数矩阵A,array_b表示方程组右侧常数,A_row表示A的行秩
def matrix_element_A_(array_A,array_b,A_row):
M=A_row #局部变量M,与全局变量M无关
matrix_A_= []
for i in range(0,M+1):
matrix_A_.append([])
for j in range(0,M+2):
matrix_A_[i].append(0)
if j<M+1:
matrix_A_[i][j] = array_A[i][j]
elif j==M+1: #如果不加这个控制条件,matrix_A_将被array_b刷新
matrix_A_[i][j] = array_b[i]
return matrix_A_
matrix_A_ = matrix_element_A_(matrix_A,matrix_b,M)
'''
多项式拟合函数
'''
#x为自变量,w为多项式系数,m为多项式的阶数
def poly_fit(x,wp,m):
sumf = 0
for j in range(0,m+1):
sumf=sumf+wp[j]*pow(x,j)
return sumf
'''
sin(2*pi*x)在x=0处的3阶泰勒展开式
'''
coef_taylor = [] #正弦函数的泰勒展开式系数
K=3 #展开到K阶
if K%2==0:
print "K必须为正奇数"
s = 0
k=(K-1)/2+1 #小k为系数个数
#求K阶泰勒展开式的系数:
for i in range(0,k):
s = pow(-1,i)*pow(2*np.pi,2*i+1)/math.factorial(2*i+1)
coef_taylor.append(s)
print "%d阶泰勒级数展开式的系数为:" %K
print coef_taylor
#tx为泰勒展开式函数的自变量
def sin_taylor(tx):
sum_tay=0
for i in range(0,k):
sum_tay=sum_tay+coef_taylor[i]*pow(tx,2*k+1)
return sum_tay
poly_taylor_a = [] #泰勒展开式函数的输入值
poly_taylor_b = [] #泰勒展开式函数的预测值
for i in range(0,N):
poly_taylor_a.append(a[i])
poly_taylor_b.append(sin_taylor(poly_taylor_a[i]))
'''
在x=[0,1]上生成100个点,作为测试集
'''
testa = [] #测试集的横坐标
testb = [] #测试集的纵坐标
x=0
for i in range(0,100):
x=x+1.0/101.0
testa.append(x)
testb.append(np.sin(2*np.pi*x))
'''
计算泰勒展开式模型的训练误差和测试误差
'''
#定义误差函数:
#ly为真实值,fx为预测值
def Lfun(ly,fx):
L=0
for i in range(0,len(fx)):
L=L+pow(ly[i]-fx[i],2)
return L
'''
主程序
'''
if __name__ == '__main__':
# 求解方程组, 并输出方程组的可解信息
ret = solve( matrix_A_, 0, 0 )
if( ret== 0 ):
print "方 程组无唯一解或无解\n"
# 输出方程组及其解,解即为w[j]
w = []
for i in range( 0, len( m ) ):
w.append(m[i][len( m )])
print "M=%d时的系数w[j]:" %M
print w
#多项式拟合后的预测值:
poly_a = []
poly_b = []
for i in range(0,N):
poly_a.append(a[i])
poly_b.append(poly_fit(poly_a[i],w,M))
#fxtay为泰勒展开式的预测值,LCtaylor为测试误差:
fxtay = []
for i in range(0,100):
fxtay.append(sin_taylor(testa[i]))
LCtaylor = Lfun(testb,fxtay)/100
print "三阶泰勒展开式的测试误差为:%f" %LCtaylor
#fxpoly为M阶多项式拟合函数的预测值,LXpoly为训练误差:
fxpoly = []
for i in range(0,N): #len(poly_b)=N=10
fxpoly.append(poly_fit(a[i],w,M))
LXpoly = Lfun(b,fxpoly)/len(poly_b)
print "M=%d时多项式拟合函数的训练误差为:%f" % (M,LXpoly)
#fxpolyc为M阶多项式拟合函数的预测值,LCpoly为测试误差:
fxpolyc = []
for i in range(0,100):
fxpolyc.append(poly_fit(testa[i],w,M))
LCpoly = Lfun(testb,fxpolyc)/100
print "M=%d时多项式拟合函数的测试误差为:%f" % (M,LCpoly)
#多项式拟合的效果:
fig1 = plt.figure(1)
plt.plot(poly_a,poly_b,color='blue',linestyle='solid',marker='o')
#加入epsilon后的样本:
plt.plot(a,b,color='red',linestyle='dashed',marker='x')
#泰勒展开式拟合效果:
plt.plot(poly_taylor_a,poly_taylor_b,color='yellow',linestyle='dashed',marker='o')
#figure(2)对比多项式拟合函数与训练数据:
fig2 = plt.figure(2)
plt.plot(poly_a,poly_b,color='blue',linestyle='solid',marker='o')
plt.plot(a,b,color='red',linestyle='dashed',marker='x')
plt.show()
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,17,1) #生成散点列表作为x的值
y=np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86, 10.00, 10.20, 10.32, 10.42, 10.50, 10.55, 10.58, 10.60]) #给定y的散点值
#用3次多项式拟合
z1=np.polyfit(x,y,3)
p1=np.poly1d(z1)
print(p1) #打印拟合的多项式
yvals=p1(x) #拟合后的y值
plot1=plt.plot(x,y,'r*',label='original values')
plot2=plt.plot(x,yvals,'b',label='polyfit values')
plt.xlabel('X ')
plt.ylabel('Y')
# 'best' : 0, (only implemented for axes legends)(自适应方式)
# 'upper right' : 1,
# 'upper left' : 2,
# 'lower left' : 3,
# 'lower right' : 4,
# 'right' : 5,
# 'center left' : 6,
# 'center right' : 7,
# 'lower center' : 8,
# 'upper center' : 9,
# 'center' : 10,
plt.legend(loc=3) #设置图示的位置
plt.title('polyfitting') #设置标题
plt.show() #显示图片
plt.savefig('p1.png')
matlab 各种参数估计函数
https://blog.csdn.net/qq278672818/article/details/62038712
Matlab插值
https://blog.csdn.net/ljyljyok/article/details/80107583
https://blog.csdn.net/gy99csdn/article/details/82025469