数模算法的整理

比赛前的整理

无约束优化问题

编写目标函数

1
2
function y=rosenbrock(x)
y=100*(x(2)-x(1).^2).^2+(1-x(1)).^2;

主函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
clear all
%无约束优化的经典算法与非经典算法比较
%使用rosenbrock函数,理论极值为0
if exist('rosenbrock.m')==0
disp('没有为方程创建名为rosenbrock.m的函数文件,请建立它');
end
%画图
[x,y]=meshgrid(-1:0.05:1,-1:0.05:1);
z=100*(y-x.^2).^2+(1-x).^2;
surf(x,y,z)
%经典算法:
[x1,fval1,exitflag1,output1]=fminunc('rosenbrock',[0,0]);%初始点为(0,0)
%x为解
%fval为目标函数x处的值
%exitflag>0表示函数已收敛到x处
%output中:Iterations表示迭代次数
% Algorithm表示采用算法
% FuncCount表示函数评价次数
%遗传算法
%调整最大允许的代数1万代,种群规模为200
options=gaoptimset('Generations',10000,'PopulationSize',200);
%设置两个变量,限制0<=x1,x2<=2
[x2,fval2,exitflag2,output2]=ga(@rosenbrock,2,[1,0;0,1;-1,0;0,-1],[2;2;0;0],[],[],[],[],[],options);
%exiflag>0表示求解成功

定积分的计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
%一重积分
%求利用符号函数求理论值
syms x;
y=exp(-x^2); %被积函数
s=int(y,x,0,1); %调用int函数
v=vpa(s); %将符号表达式转化为数值
%利用quad函数进行数值积分
f1=inline('exp(-x.^2)','x'); %被积函数
y1=quad(f1,0,1);
%二重积分
f2=inline('exp((-x.^2)/2).*sin(x.^2+y)','x','y');
y2=dblquad(f2,-2,2,-1,1);
%三重积分
f3=inline('4*x.*z.*exp(-(x.^2).*y-z.^2)','x','y','z');
y3=triplequad(f3,0,2,0,pi,0,pi);

方程的求解

等式方程的求解,约束方程的不等式最值问题

1
2
3
4
5
6
7
8
9
10
11
12
f = inline('x.^2-1');
%求解靠近0的解,然而只返回一个值,还是有很大的局限性。
answer = fzero(f, 0)
% 接一个方程组,具体的使用方式可以看官方的文档
fsolve(function, start point vector);
%解决多解的方式
solve('x^2-1=0', 'x');
syms a b r x y
solve('(x-a)^2+(y-b)^2=r^2','x')
solve('(x-a)^2+(y-b)^2=r^2','y')

相关的命令:

  1. 非线性方程组的求解: fzero, fsolve
  2. 求函数极值(无约束条件): fmin, fmins, fminu
  3. 求解线性规划问题: lp
  4. 求解非线性规划问题: constr

matlab中神经网络工具箱的使用的实例–运动运成绩的预测

参考博客

BP神经网络的预测

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
% 样本集
P=[3.2 3.2 3 3.2 3.2 3.4 3.2 3 3.2 3.2 3.2 3.9 3.1 3.2;
9.6 10.3 9 10.3 10.1 10 9.6 9 9.6 9.2 9.5 9 9.5 9.7;
3.45 3.75 3.5 3.65 3.5 3.4 3.55 3.5 3.55 3.5 3.4 3.1 3.6 3.45;
2.15 2.2 2.2 2.2 2 2.15 2.14 2.1 2.1 2.1 2.15 2 2.1 2.15;
140 120 140 150 80 130 130 100 130 140 115 80 90 130;
2.8 3.4 3.5 2.8 1.5 3.2 3.5 1.8 3.5 2.5 2.8 2.2 2.7 4.6;
11 10.9 11.4 10.8 11.3 11.5 11.8 11.3 11.8 11 11.9 13 11.1 10.85;
50 70 50 80 50 60 65 40 65 50 50 50 70 70];
% 训练的目标数据
T=[2.24 2.33 2.24 2.32 2.2 2.27 2.2 2.26 2.2 2.24 2.24 2.2 2.2 2.35];
% 归一化
[p1,minp,maxp,t1,mint,maxt]=premnmx(P,T);
net=newff(minmax(P),[8,6,1],{'tansig','tansig','purelin'},'trainlm');
net.trainParam.epochs = 5000;
net.trainParam.goal=0.0000001;
[net,tr]=train(net,p1,t1);
a=[3.0;9.3;3.3;2.05;100;2.8;11.2;50];
a=premnmx(a);
b=sim(net,a);
c=postmnmx(b,mint,maxt);
c

python中识别手写字体的设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
""" 本代码来源于YouTube中的教程 """
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn import svm
digits = datasets.load_digits()
clf = svm.SVC(gamma = 0.0001, C = 100)
print(len(digits.data))
x, y = digits.data[:-10], digits.target[:-10]
clf.fit(x, y)
print("prediction:", clf.predict(digits.data[-1]))
plt.imshow(digits.images[-1], cmap = plt.cm.gray_r, interpolation = "nearest")
plt.show()

GM(1, 1)模型来预测单值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
clear
%注意其中的数据是以列来保存的。
han1=[1
2
3
4
5
6
7
8
9
10]; %数据,建议十行以上的数据
han1(end,:)=[];
m=size(han1,2);
x0=mean(han1,2); %平均每行的数据
x1=cumsum(x0); %累加x0
alpha=0.5;
n=length(x0); %x0中元素个数
z1=alpha*x1(2:n)+(1-alpha)*x1(1:n-1)%x1的邻值生成数列
Y=x0(2:n);
B=[-z1,ones(n-1,1)];
ab=B\Y %a,b的值
c=ab(2)/ab(1)
xhat=(x0(1)-c)*(exp(-ab(1)*n)-exp(-ab(1)*(n-1)))%预测值方程

未解决的问题

文章目录
  1. 1. 无约束优化问题
    1. 1.1. 编写目标函数
    2. 1.2. 主函数
  2. 2. 定积分的计算
  3. 3. 方程的求解
    1. 3.1. 等式方程的求解,约束方程的不等式最值问题
  4. 4. matlab中神经网络工具箱的使用的实例–运动运成绩的预测
    1. 4.1. 参考博客
    2. 4.2. 代码
  5. 5. python中识别手写字体的设计
  6. 6. GM(1, 1)模型来预测单值
  7. 7. 未解决的问题
{{ live2d() }}