├── AE ├── 1traindata.xlsm ├── AE.pth ├── AE.py ├── CNN_all.py ├── __pycache__ │ └── AE.cpython-38.pyc ├── logs │ ├── 11.py │ └── events.out.tfevents.1672065758.LAPTOP-EEGD36BV.60344.0 ├── out.xlsm └── test.py ├── BFGS拟牛顿方法 ├── Armjio.m ├── BFGS.m ├── BFGSdata.txt ├── Rosenbrock.m ├── code.m └── grid.m ├── DBSCAN聚类算法 ├── code.m └── zs.m ├── GM(1,1)灰色预测 ├── CODE.m ├── gm11.m ├── newgm11.m ├── x.mat └── xcdxgm11.m ├── K-medodis聚类 ├── Kmedoids.m ├── code3.m ├── compueCentroids.m ├── data.mat ├── findClosest.m └── iterative_process.m ├── K-折交叉验证 ├── code.m └── ff.m ├── MAD算法 └── code.m ├── MATLAB — 函数.pdf ├── README.md ├── RF随机森林 ├── RF.m ├── RFprection.m ├── buildCartTree.m ├── buildRandForest.m ├── calAccuracy.m ├── calGiniIndex.m ├── chooseSample.m ├── code.m ├── data.mat ├── dataSet.m ├── labels_num2.m ├── prection.m ├── predict_data.mat ├── splitData.m └── splitData2.m ├── SVD奇异值分解 ├── code.m ├── mysvd.m ├── photocompress.m ├── 样本.jpg ├── 输出.jpg └── 输出0.jpg ├── Topsis ├── code.m ├── log1.m ├── mytop.m ├── sq.m └── x.mat ├── music ├── 《七里香》 │ ├── Qilixiang.wav │ └── code.m └── 形容 │ ├── code.m │ └── get_ware.m ├── 主成分分析 ├── code.m └── x.mat ├── 人工神经网络 ├── BP神经网络 │ ├── code.m │ ├── predict_x.mat │ ├── untitled.png │ ├── wc.m │ ├── x.mat │ ├── y.mat │ ├── zs.m │ └── 过程量.png ├── BP神经网络结合K折交叉验证 │ ├── BV.m │ ├── K.m │ ├── code.m │ ├── img.m │ ├── predict_x.mat │ ├── wc.m │ ├── x.mat │ ├── y.mat │ ├── zs.m │ ├── 第一自变量对比图.png │ └── 第二自变量对比图.png ├── CNN卷积神经网络 │ ├── CNN_upweight.m │ ├── code.m │ ├── convolution.m │ ├── f1.m │ ├── pit_init.m │ ├── pooling.m │ └── remove_average.m ├── DeepLabV3+进行语义分割 │ ├── 算法 │ │ ├── ColorMap.m │ │ ├── Data1.png │ │ ├── Data1_reference.png │ │ ├── Data2.png │ │ ├── Data2_reference.png │ │ ├── Data3.png │ │ ├── Data3_reference.png │ │ ├── Data4.png │ │ ├── Data4_reference.png │ │ ├── Data5.png │ │ ├── Data5_reference.png │ │ ├── Data6.png │ │ ├── Data6_reference.png │ │ ├── Data7.png │ │ ├── Data7_reference.png │ │ └── code.m │ ├── 裁剪原图 │ │ ├── 1-1.png │ │ ├── 1-2.png │ │ ├── 1-3.png │ │ ├── 1-4.png │ │ ├── 2-1.png │ │ ├── 2-2.png │ │ ├── 2-3.png │ │ ├── 2-4.png │ │ ├── 3-1.png │ │ ├── 3-2.png │ │ ├── 3-3.png │ │ ├── 3-4.png │ │ ├── 4-1.png │ │ ├── 4-2.png │ │ ├── 4-3.png │ │ ├── 4-4.png │ │ ├── 5-1.png │ │ ├── 5-2.png │ │ ├── 5-3.png │ │ ├── 5-4.png │ │ ├── 6-1.png │ │ ├── 6-2.png │ │ ├── 6-3.png │ │ ├── 6-4.png │ │ └── ColorMap.m │ └── 裁剪标签图 │ │ ├── 1-1.png │ │ ├── 1-2.png │ │ ├── 1-3.png │ │ ├── 1-4.png │ │ ├── 2-1.png │ │ ├── 2-2.png │ │ ├── 2-3.png │ │ ├── 2-4.png │ │ ├── 3-1.png │ │ ├── 3-2.png │ │ ├── 3-3.png │ │ ├── 3-4.png │ │ ├── 4-1.png │ │ ├── 4-2.png │ │ ├── 4-3.png │ │ ├── 4-4.png │ │ ├── 5-1.png │ │ ├── 5-2.png │ │ ├── 5-3.png │ │ ├── 5-4.png │ │ ├── 6-1.png │ │ ├── 6-2.png │ │ ├── 6-3.png │ │ └── 6-4.png └── Rosenblatt感知机 │ ├── code.m │ ├── data.mat │ └── predict_x.mat ├── 决策树分类模型 ├── code.m └── target.mat ├── 卡尔曼滤波 ├── ck_code.m ├── code2.m ├── data.mat ├── fan_angle.m ├── judge.m ├── kalman_fun.m ├── loss_fun1.m ├── main_fun.m ├── model1.m ├── model2.m ├── model3.m ├── model4.m ├── real.mat ├── save_mat.mat └── trans.m ├── 回归 ├── GRP修改 │ ├── GRP.jpg │ ├── GRP.m │ ├── MSEloss.m │ ├── code.m │ ├── data.mat │ ├── img.m │ └── x_predict.mat ├── 线性回归 │ ├── code.m │ └── data.mat ├── 逻辑回归 │ ├── code.m │ ├── data.mat │ ├── predict_x.mat │ └── sigmoid.m ├── 非线性回归 │ ├── code.m │ └── data.mat └── 高斯过程回归 │ ├── GRP.m │ ├── code.m │ ├── data.mat │ ├── img.m │ ├── wc.m │ └── x_predict.mat ├── 因子分析 ├── code.m └── data.mat ├── 层次分析 ├── x.mat └── 层次分析.m ├── 微分方程 ├── 人口预报模型 │ ├── code.m │ └── x.mat └── 微分方程库函数解析构建 │ └── code.m ├── 投影寻踪综合评价 ├── D.m ├── S.m ├── code.m ├── data.mat ├── findbest_chr.m ├── fun.m ├── judge.m ├── solveacr.m ├── solvefit.m ├── solvevar.m ├── solveworse.m ├── std.m └── ys.m ├── 支持向量机 ├── code.m ├── data.mat ├── predict_x.mat └── svm.mat ├── 敏感性分析 ├── code.m ├── solvefunction.m └── 作用.txt ├── 数值计算 └── 数值积分 │ └── code.m ├── 数据包络分析 ├── code.m └── 例子.png ├── 模拟退火 ├── BOOK │ ├── code3book.m │ ├── jg.mat │ ├── money.m │ ├── newway.m │ └── yf.mat ├── FUNCTION │ ├── code1function.m │ └── fun.m └── TSP │ ├── code2TSP.m │ ├── newpath.m │ └── path.m ├── 灰色关联性分析 ├── code.m └── data.mat ├── 理论 ├── 参考文献.pdf ├── 第01章 线性规划.pdf ├── 第02章 整数规划.pdf ├── 第03章 非线性规划.pdf ├── 第04章 动态规划.pdf ├── 第05章 图与网络.pdf ├── 第06章 排队论.pdf ├── 第07章 对策论.pdf ├── 第08章 层次分析法.pdf ├── 第09章 插值与拟合.pdf ├── 第10章 数据的统计描述和分析.pdf ├── 第11章 方差分析.pdf ├── 第12章 回归分析.pdf ├── 第13章 微分方程建模.pdf ├── 第14章 稳定状态模型.pdf ├── 第15章 常微分方程的解法.pdf ├── 第16章 差分方程模型.pdf ├── 第17章 马氏链模型.pdf ├── 第18章 变分法模型.pdf ├── 第19章 神经网络模型.pdf ├── 第20章 偏微分方程的数值解.pdf ├── 第21章 目标规划.pdf ├── 第22章 模糊数学模型.pdf ├── 第23章 现代优化算法.pdf ├── 第24章 时间序列模型.pdf ├── 第25章 存贮论.pdf ├── 第26章 经济与金融中的优化问题.pdf ├── 第27章 生产与服务运作管理中的优化问题.pdf ├── 第28章 灰色系统理论及其应用.pdf ├── 第29章 多元分析.pdf ├── 第30章 偏最小二乘回归.pdf ├── 附录一 Matlab入门.pdf ├── 附录三 运筹学的LINGO软件.pdf ├── 附录二 Matlab在线性代数中的应用.pdf └── 附录四 判别分析.pdf ├── 空闲时间code ├── code.m ├── lpc.mat ├── sxy.mat └── tsy.mat ├── 算法模型.pdf ├── 粒子群 └── PSO.m ├── 规划 ├── 整数规划 │ └── code.m ├── 线性规划 │ └── code.m └── 非线性规划 │ └── code.m ├── 遗传算法 ├── code.m ├── findbest_chr.m ├── judge.m ├── solveacr.m ├── solvefit.m ├── solvevar.m └── solveworse.m ├── 量子优化遗传算法 ├── Pop.m ├── bin2decfunction.m ├── code.m ├── coll.m ├── gate.m ├── solvefitness.m └── solvefunction.m └── 马尔科夫预测 ├── code.m └── data.mat /AE/1traindata.xlsm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/AE/1traindata.xlsm -------------------------------------------------------------------------------- /AE/AE.pth: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/AE/AE.pth -------------------------------------------------------------------------------- /AE/AE.py: -------------------------------------------------------------------------------- 1 | #AE自编码器 2 | import torch 3 | from torch.utils.data import DataLoader,Dataset 4 | from copy import deepcopy as copy 5 | from torch.utils.tensorboard import SummaryWriter 6 | import torch.nn as nn 7 | import pandas as pd 8 | import numpy as np 9 | import shutil 10 | import os 11 | class Mydata(Dataset): 12 | def __init__(self,rootdata): 13 | self.rootdata=rootdata 14 | def __getitem__(self, item): 15 | return torch.Tensor(self.rootdata[item][5:]) 16 | def __len__(self): 17 | return len(self.rootdata) 18 | 19 | #AE模型 20 | class AE(nn.Module): 21 | def __init__(self,inchannel): 22 | super(AE, self).__init__() 23 | self.encoder=nn.Sequential( 24 | nn.Linear(inchannel,4), 25 | nn.Sigmoid(), 26 | # nn.Linear(32,16), 27 | # nn.ReLU(), 28 | # nn.Linear(16,8), 29 | # nn.ReLU(), 30 | # nn.Linear(8,4), 31 | # nn.ReLU() 32 | ) 33 | self.decoder=nn.Sequential( 34 | # nn.Linear(4,8), 35 | # nn.ReLU(), 36 | # nn.Linear(8,16), 37 | # nn.ReLU(), 38 | # nn.Linear(16,32), 39 | # nn.ReLU(), 40 | nn.Linear(4,inchannel), 41 | nn.Sigmoid() 42 | ) 43 | def forward(self,x): 44 | x1=self.encoder(x) 45 | return self.decoder(x1),x1 46 | #归一化 47 | def std(data): 48 | data1=data-np.mean(data,axis=0) 49 | data2=data1/np.std(data,axis=0) 50 | return data2 51 | #训练过程 52 | def train_progress(epoch): 53 | 54 | best_model=None #最优模型 55 | global best_loss 56 | epoch_cnt = 0 57 | for i in range(epoch): 58 | sum_loss = 0 59 | item=0 60 | for x in traindata: 61 | # x=x.cuda() 62 | y, deepy = model(x) 63 | loss = lossfun(y, x) 64 | optim.zero_grad() 65 | loss.backward() 66 | optim.step() 67 | sum_loss += loss 68 | item+=1 69 | writer.add_scalar('AE process', sum_loss/item, i) 70 | print('第{}轮训练完成,其总loss为sum_loss={},平均loss为ave_loss={}'.format(i + 1, sum_loss,sum_loss/item)) 71 | 72 | 73 | # 记录模型 74 | if best_loss > sum_loss: 75 | best_loss = sum_loss 76 | best_model = copy(model) 77 | epoch_cnt = 0 78 | else: 79 | epoch_cnt += 1 80 | # 后续的early_stop次模型都没有更好的就保存模型退出循环 81 | if epoch_cnt > early_stop: 82 | torch.save(best_model.state_dict(), './AE.pth') 83 | break 84 | 85 | torch.save(best_model.state_dict(), './AE.pth') 86 | if __name__=='__main__': 87 | # 载入excel数据 88 | if os.path.exists('./logs'): 89 | shutil.rmtree('./logs') 90 | # 绘图工具 91 | writer = SummaryWriter('./logs') 92 | df = pd.read_excel(r'C:\Users\86187\Desktop\1traindata.xlsm') 93 | rootdata = std(np.array(df)) 94 | traindata = Mydata(rootdata) 95 | traindata = DataLoader(dataset=traindata, batch_size=100, shuffle=False) 96 | print('数据集加载完毕!') 97 | model = AE(11) 98 | #model = model.cuda() 99 | print('模型加载完毕!') 100 | # 损失函数 101 | lossfun = nn.MSELoss() 102 | #lossfun = lossfun.cuda() 103 | # 优化器 104 | optim = torch.optim.SGD(model.parameters(), lr=0.1,momentum=0.5) 105 | 106 | early_stop=100 107 | best_loss=np.inf 108 | loss_list=[] 109 | epoch=2000 110 | train_progress(epoch) 111 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /AE/CNN_all.py: -------------------------------------------------------------------------------- 1 | #完整的模型训练套路 2 | import torch 3 | import torchvision 4 | from torch.utils.data import DataLoader 5 | import torch.nn as nn 6 | from torch.nn import MaxPool2d,Conv2d,Sequential,CrossEntropyLoss,Linear,Sigmoid,Flatten 7 | from torch.utils.tensorboard import SummaryWriter 8 | import shutil 9 | shutil.rmtree('../logs') 10 | train=torchvision.datasets.CIFAR10('../dataset',train=True,transform=torchvision.transforms.ToTensor()) 11 | test=torchvision.datasets.CIFAR10('../dataset',train=False,transform=torchvision.transforms.ToTensor()) 12 | 13 | #绘图工具 14 | writer=SummaryWriter('../logs') 15 | #打印长度 16 | print('训练集的长度为{}\n测试集的长度为{}'.format(len(train),len(test))) 17 | 18 | #加载数据集 19 | traindata=DataLoader(train,batch_size=64,shuffle=True) 20 | testdata=DataLoader(test,batch_size=64,shuffle=True) 21 | 22 | #加载模型 23 | class Model(nn.Module): 24 | def __init__(self): 25 | super(Model, self).__init__() 26 | self.model = Sequential( 27 | Conv2d(3, 32, kernel_size=5, padding='same'),#3*3 28 | MaxPool2d(kernel_size=2), 29 | Conv2d(32, 32, kernel_size=5, padding=2),#bn 30 | MaxPool2d(kernel_size=2), 31 | Conv2d(32, 64, kernel_size=5, padding=2),#Dropout层 32 | MaxPool2d(kernel_size=2), 33 | Flatten(), 34 | Linear(1024, 64), # 64个类别 35 | Linear(64, 10) 36 | ) 37 | def forward(self,x): 38 | return self.model(x) 39 | tsy=Model() 40 | #损失函数 41 | loss_fun=CrossEntropyLoss() 42 | #优化器 43 | l_r=0.01 44 | op=torch.optim.SGD(tsy.parameters(),lr=l_r,momentum=0.9) #momentum动量防止权重陷入局部最优 45 | #设置训练网络参数 46 | total_train=0 #训练次数记录 47 | total_test=0 #测试训练次数 48 | 49 | epoch=10 #训练轮数 50 | for i in range(epoch): 51 | print('-----第{}轮训练开始----'.format(i+1)) 52 | #训练开始 53 | tsy.train() 54 | for img,target in traindata: 55 | output=tsy(img) 56 | loss=loss_fun(output,target) 57 | #调优,反向回馈 58 | op.zero_grad() 59 | loss.backward() 60 | op.step() 61 | total_train+=1 62 | if total_train%100==0: 63 | print('训练次数为{}时其损失为{}'.format(total_train, loss)) 64 | writer.add_scalar('img of loss about train_time',loss,total_train) 65 | #测试 66 | tsy.eval() 67 | total_true = 0 # 正确测试集个数 68 | total_loss=0 69 | with torch.no_grad(): 70 | for img, target in testdata: 71 | output = tsy(img) 72 | loss = loss_fun(output, target) 73 | total_loss = total_loss + loss 74 | total_test+=1 75 | true=(output.argmax(1)==target).sum() #横向最大的索引 76 | total_true=total_true+true 77 | print('数据集上的平均loss为{}'.format(total_loss/len(test))) 78 | print('正确率为{}'.format(total_true/len(testdata))) 79 | writer.add_scalar('img of total_loss about test_time',total_loss,total_test) 80 | print('训练完成') 81 | -------------------------------------------------------------------------------- /AE/__pycache__/AE.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/AE/__pycache__/AE.cpython-38.pyc -------------------------------------------------------------------------------- /AE/logs/11.py: -------------------------------------------------------------------------------- 1 | import torch 2 | print(torch.cuda.is_available()) 3 | 4 | -------------------------------------------------------------------------------- /AE/logs/events.out.tfevents.1672065758.LAPTOP-EEGD36BV.60344.0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/AE/logs/events.out.tfevents.1672065758.LAPTOP-EEGD36BV.60344.0 -------------------------------------------------------------------------------- /AE/out.xlsm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/AE/out.xlsm -------------------------------------------------------------------------------- /AE/test.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import pandas as pd 3 | import numpy as np 4 | import AE 5 | model=AE.AE(11) 6 | model.load_state_dict(torch.load('./AE.pth'),False) 7 | df=pd.read_excel(r'C:\Users\86187\Desktop\1traindata.xlsm') 8 | rootdata = AE.std(np.array(df)) 9 | traindata = AE.Mydata(rootdata) 10 | traindata=AE.DataLoader(traindata,batch_size=1,shuffle=False) 11 | list1=[] 12 | list2=[] 13 | list3=[] 14 | list4=[] 15 | for data in traindata: 16 | a,b=model(data) 17 | b=b.detach().numpy() 18 | list1.append(b[0][0]) 19 | list2.append(b[0][1]) 20 | list3.append(b[0][2]) 21 | list4.append(b[0][3]) 22 | 23 | df1=pd.DataFrame({'F1':list1, 24 | 'F2':list2, 25 | 'F3':list3, 26 | 'F4':list4 27 | }) 28 | df1.to_excel('./out.xlsm',index=False) -------------------------------------------------------------------------------- /BFGS拟牛顿方法/Armjio.m: -------------------------------------------------------------------------------- 1 | function [alpha] = Armjio(fun, grid, x0, dk) 2 | % 3 | % Function [alpha, xk, fx, k] = Armjio(fun, grid, x0, dk) 4 | % 求出函数fun在x0处以dk为下降方向时的步长alpha,同时返回相对应的下 5 | % 一个下降点xk以及xk处的函数值fx,k为迭代次数 6 | % ----------------------------------------------------------- 7 | % 输入: 8 | % fun 函数名称(字符变量) 9 | % grid 梯度函数名称(字符变量) 10 | % x0 迭代点(列向量) 11 | % dk 函数在迭代点处的下降方向(列向量) 12 | % 13 | % 输出: 14 | % alpha 函数在x0处以dk为下降方向时的下降步长 15 | % xk 函数在x0处以dk为下降方向,以alpha为步长 16 | % 求得的下降点 17 | % fx 函数在下降点xk处的函数值 18 | % k 求步长算法迭代次数 19 | % ----------------------------------------------------------- 20 | % by Zhi Qiangfeng 21 | % 22 | beta = 0.333; % 步长 alpha 的迭代系数,小于 1 23 | rho = 1e-3; % 泰勒展开式补足系数,0 < rho < 1/2 24 | alpha = 1; % 初始步长为 1 25 | k = 0; % 统计迭代次数 26 | g=grid; 27 | gk = g(x0(1),x0(2)); % x0处的梯度值 28 | fd = feval(fun, x0 + alpha * dk); % 函数在下一个迭代点处的目标函数值 29 | fk = feval(fun, x0) + alpha * rho * gk' * dk; % 函数在下一个迭代点处的泰勒展开值 30 | while fd > fk 31 | alpha = beta * alpha; 32 | fd = feval(fun, x0 + alpha * dk); 33 | fk = feval(fun, x0) + alpha * rho * gk' * dk; 34 | k = k + 1; 35 | end 36 | end 37 | 38 | -------------------------------------------------------------------------------- /BFGS拟牛顿方法/BFGS.m: -------------------------------------------------------------------------------- 1 | function [f, xk, k] = BFGS(x0, fun, grid, eps, kmax) 2 | % 3 | % function [f, xk, k] = BFGS(x0, fun, grid, eps, kmax) 4 | % 求出函数fun从初始点x0处以拟牛顿方向为下降方向, 5 | % 采用 Armjio 准则计算迭代步长,求出函数的极小点 6 | % ----------------------------------------------------------- 7 | % 输入: 8 | % x0 初始点(列向量) 9 | % fun 函数文件名称(字符变量) 10 | % grid 梯度函数文件名称(字符变量) 11 | % eps 精度要求 12 | % kmax 函数的最大迭代次数 13 | % 14 | % 输出: 15 | % f 函数在极小值 xk 处的目标函数值 16 | % xk 函数采用此方法求得的极小点 17 | % k 求极小点算法迭代次数 18 | % ----------------------------------------------------------- 19 | % by Zhi Qiangfeng 20 | % 21 | k = 0; 22 | n = length(x0); 23 | H0 = eye(n); % 初始选取单位阵作为Hessen矩阵的逆的近似阵 24 | Hk = H0; 25 | xk = x0; 26 | g=grid; 27 | gk = g(xk(1),xk(2)); 28 | while k <= kmax 29 | if norm(gk) < eps 30 | break; 31 | end 32 | dk = -Hk * gk; % 拟牛顿下降方向 33 | alpha = Armjio(fun, grid, xk, dk); 34 | x_ = xk; % x_ 保存上一个点坐标 35 | xk = x_ + alpha * dk; % 更新 xk 36 | gk_ = gk; % gk_ 保存上一个点的梯度值 37 | gk = g(xk(1),xk(2)); % 更新 gk 38 | sk = xk - x_; % 记 xk - x_ 为 sk 39 | yk = gk - gk_; % 记 gk - gk_ 为 yk 40 | if sk' * yk > 0 41 | v = yk' * sk; 42 | % BFGS公式 43 | Hk = Hk + (1 + (yk' * Hk * yk) / v) * (sk * sk') / v - (sk * yk' * Hk + Hk * yk * sk') / v; 44 | end 45 | k = k + 1; 46 | end 47 | f = feval(fun, xk); 48 | end 49 | -------------------------------------------------------------------------------- /BFGS拟牛顿方法/BFGSdata.txt: -------------------------------------------------------------------------------- 1 | 初始点 极小点 目标函数值 迭代次数 运行时间 2 | [-2.753093, -5.778531] [1.000000, 1.000000] 0.000000 45 0.041740 3 | [-3.280834, -3.126815] [1.000000, 1.000000] 0.000000 87 0.029131 4 | [-1.389566, -2.933386] [1.000000, 1.000000] 0.000000 43 0.024519 5 | [-3.744361, -4.074813] [1.000000, 1.000000] 0.000000 30 0.025501 6 | [-2.373091, -2.204620] [1.000000, 1.000000] 0.000000 21 0.024631 7 | [-5.927892, -0.226433] [1.000000, 1.000000] 0.000000 46 0.023169 8 | [-5.311008, -5.479721] [1.000000, 1.000000] 0.000000 53 0.025421 9 | [-4.777103, -0.592274] [1.000000, 1.000000] 0.000000 29 0.023092 10 | [-1.571227, -2.012141] [1.000000, 1.000000] 0.000000 37 0.025384 11 | [-4.078368, -0.819319] [1.000000, 1.000000] 0.000000 27 0.023462 12 | -------------------------------------------------------------------------------- /BFGS拟牛顿方法/Rosenbrock.m: -------------------------------------------------------------------------------- 1 | %% 函数文件 2 | function f = Rosenbrock(x) 3 | f = 100 * (x(2) - x(1)^2)^2 + (1 - x(1))^2; 4 | end 5 | -------------------------------------------------------------------------------- /BFGS拟牛顿方法/code.m: -------------------------------------------------------------------------------- 1 | %% 主程序BFGS拟牛顿算法 2 | %主用于已知映射函数的优化计算 3 | clc;clear 4 | X = randi([-10, 10], 1, 1) * rand(2, 10);%定义初始点,每列为一个样本 5 | eps = 1e-5; 6 | kmax = 3000; 7 | file = fopen("./BFGSdata.txt", "w"); 8 | fprintf(file, "初始点\t\t\t\t\t 极小点\t\t\t\t 目标函数值\t\t 迭代次数\t 运行时间\n"); 9 | for i = 1:10 10 | tic 11 | x0 = X(:, i); 12 | [f, xk, k] = BFGS(x0, @Rosenbrock, grid, eps, kmax); 13 | t = toc; 14 | fprintf(file, "[%f, %f]\t[%f, %f]\t%f\t\t%d\t\t\t%f\n", x0(1), x0(2), xk(1), xk(2), f, k, t); 15 | end -------------------------------------------------------------------------------- /BFGS拟牛顿方法/grid.m: -------------------------------------------------------------------------------- 1 | %% 梯度函数文件 2 | function g = grid(~) 3 | syms a b 4 | 5 | g_out=Rosenbrock([a;b]); 6 | grad_ff=gradient(g_out,[a b]); 7 | g=matlabFunction(grad_ff); 8 | 9 | end 10 | -------------------------------------------------------------------------------- /DBSCAN聚类算法/code.m: -------------------------------------------------------------------------------- 1 | clear; 2 | close all; 3 | clc; 4 | k = 3; 5 | Eps = 2; 6 | 7 | %% 生成模拟数据 8 | n = 200; 9 | a = linspace(0,8*pi,n/2); 10 | u = [5*cos(a)+5 10*cos(a)+5]'+1*rand(n,1); 11 | v = [5*sin(a)+5 10*sin(a)+5]'+1*rand(n,1); 12 | mu1 = [20 20]; 13 | S1 = [10 0;0 10]; 14 | data1 = mvnrnd(mu1,S1,100);%生成随机数 15 | data = [u v;data1]; 16 | 17 | % image = imread('data.png'); 18 | % image = image(:,:,1); 19 | % [x,y]=find(image == 0); 20 | % data=[x,y]; 21 | 22 | %% 准备变量,输出原始结果 23 | [m,n] = size(data); 24 | data=[(1:m)',data]; 25 | n = n + 1; 26 | type = zeros(1,m); 27 | cluster_No = 1; 28 | visited = zeros(m,1); 29 | class = zeros(1,m)-2; 30 | 31 | figure(2); 32 | plot(data(:,2),data(:,3),'k.'); 33 | grid on 34 | daspect([1 1 1]);%控制坐标轴数据的单位长度 35 | xlabel('x');ylabel('y'); 36 | title('原始输入点'); 37 | hold on; 38 | 39 | %% DBscan 40 | Kdtree = KDTreeSearcher(data(:,2:3)); 41 | 42 | for i = 1:m 43 | % 抽取一个未访问点 44 | if visited(i)==0 45 | % 标为访问 46 | visited(i) = 1; 47 | point_now = data(i,:); 48 | Idx_range = rangesearch(Kdtree, point_now(2:3), Eps); 49 | index = Idx_range{1}; 50 | if length(index) > k 51 | class(i) = cluster_No; 52 | while index 53 | if visited(index(1)) == 0 54 | visited(index(1)) = 1; 55 | if class(index(1)) <= 0 56 | class(index(1)) = cluster_No; 57 | end 58 | point_now = data(index(1),:); 59 | Idx_range = rangesearch(Kdtree, point_now(2:3), Eps); 60 | index_temp = Idx_range{1}; 61 | index(1) = []; 62 | if length(index_temp) > k 63 | index = [index, index_temp]; 64 | end 65 | else 66 | index(1) = []; 67 | end 68 | end 69 | cluster_No = cluster_No + 1; 70 | end 71 | end 72 | end 73 | 74 | %% DBscan聚类结果 75 | figure; 76 | for i = 1: cluster_No 77 | color = [rand(),rand(),rand()]; 78 | data_class = data(find(class==i),:); 79 | plot(data_class(:,2),data_class(:,3),'.','Color',color,'MarkerFaceColor',color); 80 | hold on 81 | end 82 | data_class = data(find(class<=0),:); 83 | plot(data_class(:,2),data_class(:,3),'k*'); 84 | hold on 85 | grid on 86 | daspect([1 1 1]); 87 | xlabel('x');ylabel('y'); 88 | title('DBscan聚类结果'); 89 | -------------------------------------------------------------------------------- /DBSCAN聚类算法/zs.m: -------------------------------------------------------------------------------- 1 | %% 关于代码及其原理 2 | %https://blog.csdn.net/john_xia/article/details/107662116?ops_request_misc=&request_id=&biz_id=102&utm_term=dbscan%E8%81%9A%E7%B1%BB%E7%AE%97%E6%B3%95matlab&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-107662116.nonecase&spm=1018.2226.3001.4187 -------------------------------------------------------------------------------- /GM(1,1)灰色预测/CODE.m: -------------------------------------------------------------------------------- 1 | %% GM(1,1)灰色预测模型 2 | %输入变量为行向量 3 | %依据时间的连续变化给出的预测模型 4 | %% 初始化 5 | clear;clc 6 | load x.mat; 7 | %% 判断是否存在非负序列 8 | y0=x(:,1)'; %*****输入预测的变量 9 | n=length(y0); 10 | er=0;%错误指标出错就置1 11 | %判断是否有非负元素 12 | if sum(y0<0)>0 13 | disp('存在负数,无法进行灰色预测') 14 | er=1; 15 | end 16 | 17 | %% 进行准指数规律检验 18 | egh=0;%判断是否通过准指数规律检验的指标 19 | if er==0 20 | disp('准指数规律检验') 21 | y1=cumsum(y0); 22 | gh=y0(2:end)./y1(1:end-1); 23 | disp(strcat('type1:光滑比小于0.5的数据占比为',num2str(100*sum(gh<0.5)/(n-1)),'%')) 24 | disp(strcat('type2:除去前两个时期外,光滑比小于0.5的数据占比为',num2str(100*sum(gh(3:end)<0.5)/(n-3)),'%')) 25 | if 100*sum(gh<0.5)/(n-1)<60 || 100*sum(gh(3:end)<0.5)/(n-3)<90 26 | egh=1; 27 | end 28 | end 29 | 30 | if egh==0 31 | disp("通过准指数规律检验") 32 | else 33 | disp("没有通过准指数规律检验") 34 | end 35 | %% 利用试验组来选择使用传统的GM(1,1)模型、新信息GM(1,1)模型还是新陈代谢GM(1,1)模型 36 | if er==0&&egh==0 37 | if n>7 38 | test=3; 39 | else 40 | test=2; 41 | end 42 | train=y0(1:end-test); 43 | testnum=y0(end-test+1:end); 44 | disp('----------------------------分割线--------------------------------') 45 | %传统GM(1,1)模型 46 | disp('传统GM(1,1)模型') 47 | return0 = gm11(train,test) 48 | disp('----------------------------分割线--------------------------------') 49 | disp('新信息GM(1,1)模型') 50 | return1 = newgm11(train,test) 51 | disp('----------------------------分割线--------------------------------') 52 | disp('新陈代谢GM(1,1)模型') 53 | return2 = xcdxgm11(train,test) 54 | disp('----------------------------分割线--------------------------------') 55 | % 现在比较三种模型对于试验数据的预测结果 56 | % 计算误差平方和SSE 57 | SSE1 = sum((testnum-return0).^2); 58 | SSE2 = sum((testnum-return1).^2); 59 | SSE3 = sum((testnum-return2).^2); 60 | disp(strcat('传统GM(1,1)对于试验组预测的SSE为',num2str(SSE1))) 61 | disp(strcat('新信息GM(1,1)对于试验组预测的SSE为',num2str(SSE2))) 62 | disp(strcat('新陈代谢GM(1,1)对于试验组预测的SSE为',num2str(SSE3))) 63 | end 64 | %% 下面选用SSE最小的模型进行预测 65 | if SSE1middle+c*middle1 30 | new(i,j)=middle+c*middle1; 31 | elseif old(j) bestGini && m2>0 && m3>0 25 | bestGini = gGini; 26 | bestFeature = [a,feature_values(b,n1)]; 27 | rightData = D1; 28 | leftData = D2; 29 | end 30 | 31 | end 32 | end 33 | if bestGini > 0 34 | note = buildCartTree(rightData,k) ; 35 | right = note; 36 | note = buildCartTree(leftData,k) ; 37 | left = note ; 38 | s1 = 'bestFeature'; 39 | s2 = 'value'; 40 | s3 = 'rightBranch'; 41 | s4 = 'leftBranch'; 42 | s5 = 'leaf'; 43 | leafValue = []; 44 | note = struct(s1,bestFeature(1,1),s2,bestFeature(1,2),s3,right,s4,left,s5,leafValue); 45 | else 46 | leafValue = data(1,n); 47 | s1 = 'leaf'; 48 | note = struct(s1,leafValue); 49 | end 50 | end 51 | end -------------------------------------------------------------------------------- /RF随机森林/buildRandForest.m: -------------------------------------------------------------------------------- 1 | 2 | function RF = buildRandForest(dataTrain,treeNum) 3 | RF = []; 4 | 5 | fprintf('正在训练随机森林,共%d课树\n',treeNum); 6 | for a = 1: treeNum 7 | data = dataTrain(:,:,a); 8 | note = buildCartTree(data,0); 9 | fprintf('第%d课树训练完成\n',a); 10 | RF = [RF,note]; 11 | fprintf('===============分界线================\n'); 12 | end 13 | disp('随机森林训练完成!') 14 | end -------------------------------------------------------------------------------- /RF随机森林/calAccuracy.m: -------------------------------------------------------------------------------- 1 | 2 | function accuracy = calAccuracy(dataTest,RF_prection) 3 | [m,n] = size(dataTest); 4 | A = dataTest(:,n); 5 | right = sum(A == RF_prection); 6 | accuracy = right/m; 7 | end -------------------------------------------------------------------------------- /RF随机森林/calGiniIndex.m: -------------------------------------------------------------------------------- 1 | function Gini = calGiniIndex(data) 2 | [m,n] = size(data); 3 | if m == 0 4 | Gini = 0; 5 | else 6 | labelsNum = labels_num2(data); 7 | [m1,n1] = size(labelsNum); 8 | 9 | Gini = 0; 10 | for a = 1:m1 11 | Gini = Gini + labelsNum(a,n1)^2; 12 | end 13 | Gini = 1 - Gini/(m^2); 14 | end 15 | end -------------------------------------------------------------------------------- /RF随机森林/chooseSample.m: -------------------------------------------------------------------------------- 1 | function [data,feature] = chooseSample(data1,featureNum,dataNum) 2 | [m,n] = size(data1); 3 | B = randperm(n-1); 4 | feature = B(1,1:featureNum); 5 | C= zeros(1,dataNum); 6 | A = randperm(m); 7 | C(1,:) = A(1,1:dataNum); 8 | data= data1(C,feature); 9 | data = [data,data1(C,n)]; 10 | end -------------------------------------------------------------------------------- /RF随机森林/code.m: -------------------------------------------------------------------------------- 1 | %% RF随机森林 2 | clc;clear 3 | treeNum = 15;%决策树数量 4 | load data.mat%载入数据 5 | %数据的前1:end-1列为特征 6 | %数据end列为分类器结果 7 | temp=randperm(size(data,1));%随机打乱已知样本数据 8 | num=round(size(data,1)*0.8);%将前0.8*size(data,1)的数据作为训练集 9 | dataTrain=data(temp(1:num),:); 10 | dataTest=data(temp(num+1:end),:); 11 | load predict_data.mat%载入预测数据的特征 12 | 13 | [dataNum,featureNum]=size(dataTrain); 14 | featureNum=featureNum-1; 15 | [y,RF_model,featuremat]=RF(treeNum ,featureNum,dataNum ,dataTrain,dataTest); 16 | fprintf('\n随机森林分类准确率为:%f %%\n',y*100); 17 | % 预测与输出 18 | RF_prection = RFprection(RF_model,featuremat,predict_data); 19 | disp('随机森林分类结果为') 20 | disp(RF_prection); -------------------------------------------------------------------------------- /RF随机森林/data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/RF随机森林/data.mat -------------------------------------------------------------------------------- /RF随机森林/dataSet.m: -------------------------------------------------------------------------------- 1 | function [dataAll,featureAll] = dataSet(dataTrain,treeNum,featureNum,dataNum)%数据集建立子函数 2 | dataAll = zeros(dataNum,featureNum+1,treeNum); 3 | featureAll = zeros(featureNum,1,treeNum); 4 | for a = 1: treeNum 5 | [data,feature] = chooseSample(dataTrain,featureNum,dataNum); 6 | dataAll(:,:,a) = data; 7 | featureAll(:,:,a) = feature'; 8 | end 9 | end -------------------------------------------------------------------------------- /RF随机森林/labels_num2.m: -------------------------------------------------------------------------------- 1 | %统计标签中不同类型标签的数量 2 | function labelsNum = labels_num2(data) 3 | [m,n] = size(data); 4 | 5 | if m == 0 6 | labelsNum = 0; 7 | else 8 | labels = data(:,n); 9 | 10 | A = unique(labels,'sorted'); 11 | [m1,n1] = size(A); 12 | B = zeros(m1,2); 13 | B(:,1) = A(:,1); 14 | for a = 1:m1 15 | B(a,2) = size(find(labels == A(a,1)),1); 16 | end 17 | labelsNum = B; 18 | end 19 | end -------------------------------------------------------------------------------- /RF随机森林/prection.m: -------------------------------------------------------------------------------- 1 | 2 | function A = prection(RF_single,sample) 3 | if isempty(RF_single.leaf) == 0 4 | A = RF_single.leaf; 5 | else 6 | B = sample(1,RF_single.bestFeature); 7 | if B >= RF_single.value 8 | branch = RF_single.rightBranch; 9 | else 10 | branch = RF_single.leftBranch; 11 | end 12 | A = prection(branch,sample); 13 | end 14 | end -------------------------------------------------------------------------------- /RF随机森林/predict_data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/RF随机森林/predict_data.mat -------------------------------------------------------------------------------- /RF随机森林/splitData.m: -------------------------------------------------------------------------------- 1 | function [Data1,Data2] = splitData(data,fea,value) 2 | 3 | D1 = []; 4 | D2 = []; 5 | [m,n] = size(data); 6 | if m == 0 7 | D1 = 0; 8 | D2 = 0; 9 | else 10 | D1 = find(data(:,fea) >= value); 11 | D2 = find(data(:,fea) < value); 12 | Data1 = data(D1,:); 13 | Data2 = data(D2,:); 14 | end 15 | end -------------------------------------------------------------------------------- /RF随机森林/splitData2.m: -------------------------------------------------------------------------------- 1 | function data = splitData2(dataTrain,feature) 2 | [m,n] = size(dataTrain); 3 | [m1,n1] = size(feature); 4 | data = zeros(m,m1); 5 | 6 | data(:,:) = dataTrain(:,feature); 7 | end -------------------------------------------------------------------------------- /SVD奇异值分解/code.m: -------------------------------------------------------------------------------- 1 | %% 奇异值分解图片压缩程序 2 | photocompress('样本.jpg','输出0.jpg',0.8,1); -------------------------------------------------------------------------------- /SVD奇异值分解/mysvd.m: -------------------------------------------------------------------------------- 1 | %SVD奇异值分解压缩 2 | function [M]=mysvd(A,r) 3 | [U,S,V]=svd(A);%V储存的是未经过转置的矩阵,S储存奇异值矩阵 4 | eigs=diag(S);%产生奇异值的列向量,diag()将S对角元素转成列向量 5 | Sum=sum(eigs);%奇异值的和 6 | temp=0;%初始化奇异值的和 7 | for i=1:length(eigs) 8 | temp=temp+eigs(i); 9 | if(temp/Sum)>r 10 | break 11 | end 12 | end 13 | M=U(:,1:i)*S(1:i,1:i)*V(:,1:i)'%生成压缩矩阵,压缩矩阵的大小不变但是秩减少 14 | end 15 | -------------------------------------------------------------------------------- /SVD奇异值分解/photocompress.m: -------------------------------------------------------------------------------- 1 | %压缩主函数程序 2 | % pa为图片路径,save为保存路径,r为压缩特征比例既压缩系数 3 | %gray表示执行是否把彩色图片转换为灰色图片 4 | function []= photocompress(pa,save,r,gray) 5 | if nargin==3 6 | gray=0; 7 | end 8 | img=double(imread(pa)); 9 | if (gray==1) && (size(img,3)==3) 10 | img=double(rgb2gray(imread(pa)));%imread()只能用源文件路径,不能使用img 11 | end 12 | if size(img,3)==3 13 | R=img(:,:,1); 14 | G=img(:,:,2); 15 | B=img(:,:,3); 16 | disp(['正在对',pa,'的红色要素进行压缩']) 17 | r=mysvd(R,r); 18 | disp(['正在对',pa,'的绿色要素进行压缩']) 19 | g=mysvd(G,r); 20 | disp(['正在对',pa,'的蓝色要素进行压缩']) 21 | b=mysvd(B,r); 22 | newimg=cat(3,r,g,b); 23 | else 24 | disp(['正在对',pa,'进行灰色图片压缩']) 25 | newimg=mysvd(img,r); 26 | end 27 | imshow(uint8(newimg)); 28 | imwrite(uint8(newimg),save); 29 | disp('压缩完成') 30 | end 31 | 32 | -------------------------------------------------------------------------------- /SVD奇异值分解/样本.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/SVD奇异值分解/样本.jpg -------------------------------------------------------------------------------- /SVD奇异值分解/输出.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/SVD奇异值分解/输出.jpg -------------------------------------------------------------------------------- /SVD奇异值分解/输出0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/SVD奇异值分解/输出0.jpg -------------------------------------------------------------------------------- /Topsis/code.m: -------------------------------------------------------------------------------- 1 | clc;clear 2 | load x.mat 3 | x(:,4)=max(x(:,4))-x(:,4); 4 | w=sq(x) 5 | out=mytop(x) 6 | -------------------------------------------------------------------------------- /Topsis/log1.m: -------------------------------------------------------------------------------- 1 | function [out]=log1(in) 2 | n=length(in); 3 | out=zeros(n,1); 4 | for i=1:n 5 | if in(i)==0 6 | out(i)=0; 7 | else 8 | out(i)=log(in(i)); 9 | end 10 | end 11 | end -------------------------------------------------------------------------------- /Topsis/mytop.m: -------------------------------------------------------------------------------- 1 | function [out]=mytop(in) 2 | a=sqrt(sum(in.*in)); 3 | b=in./a;%标准化矩阵 4 | w=sq(in); 5 | [m,n]=size(in); 6 | w1=repmat(w,m,1);%权重矩阵 7 | d1=sqrt(sum(w1.*(b-repmat(max(b),m,1)).^2,2));%得到每个样本的di+ 8 | d2=sqrt(sum(w1.*(b-repmat(min(b),m,1)).^2,2));%得到每个样本的di- 9 | out=d2./(d1+d2);%计算每个样本的得分 10 | -------------------------------------------------------------------------------- /Topsis/sq.m: -------------------------------------------------------------------------------- 1 | function [out]=sq(in) 2 | [r,c]=size(in); 3 | if sum(sum(in<0))==0 4 | bin=in./sqrt(repmat(sum(in.*in),r,1)); 5 | else 6 | bin=(in-repmat(min(in),r,1))./(repmat(max(in),r,1)-repmat(min(in),r,1));%标准化矩阵 7 | end 8 | p=bin./repmat(sum(bin),r,1);%得到概率矩阵 9 | d=zeros(1,c); 10 | for i=1:c 11 | p1=p(:,i); 12 | e=-sum(p1.*log1(p1))/log(r); 13 | d(i)=1-e; 14 | end 15 | out=d./sum(d);%信息熵 16 | 17 | 18 | -------------------------------------------------------------------------------- /Topsis/x.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/Topsis/x.mat -------------------------------------------------------------------------------- /music/《七里香》/Qilixiang.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/music/《七里香》/Qilixiang.wav -------------------------------------------------------------------------------- /music/《七里香》/code.m: -------------------------------------------------------------------------------- 1 | fs = 44100; 2 | dt = 1/fs; 3 | T16 = 0.2; 4 | t16 = [0:dt:T16]; 5 | [temp k] = size(t16); 6 | t2 = linspace(0,8*T16,8*k); 7 | t3 = linspace(0,7*T16,7*k);%7/16拍 8 | t4_25=linspace(0,5*T16,5*k);%5/16拍 9 | t4 = linspace(0,4*T16,4*k); 10 | t6 = linspace(0,3*T16,3*k);%3/16拍 11 | t8 = linspace(0,2*T16,2*k); 12 | [temp i] = size(t4); 13 | [temp j] = size(t8); 14 | 15 | mod2 = sin(pi*t2/t2(end)); 16 | mod3= sin(pi*t3/t3(end)); 17 | mod4 = sin(pi*t4/t4(end)); 18 | mod4_25= sin(pi*t4_25/t4_25(end)); 19 | mod6 = sin(pi*t6/t6(end)); 20 | mod8 = sin(pi*t8/t8(end)); 21 | mod16 = sin(pi*t16/t16(end)); 22 | f0 = 2*146.8; 23 | ScaleTable = [2/3 3/4 5/6 15/16 ... 24 | 1 9/8 5/4 4/3 3/2 5/3 9/5 15/8 ... 25 | 2 9/4 5/2 8/3 3 10/3 15/4 4 ... 26 | 1/2 9/16 5/8]; 27 | 28 | % 1/4 notes 29 | do0f = mod4.*cos(2*pi*ScaleTable(21)*f0*t4); 30 | re0f = mod4.*cos(2*pi*ScaleTable(22)*f0*t4); 31 | mi0f = mod4.*cos(2*pi*ScaleTable(23)*f0*t4); 32 | fa0f = mod4.*cos(2*pi*ScaleTable(1)*f0*t4); 33 | so0f = mod4.*cos(2*pi*ScaleTable(2)*f0*t4); 34 | la0f = mod4.*cos(2*pi*ScaleTable(3)*f0*t4); 35 | ti0f = mod4.*cos(2*pi*ScaleTable(4)*f0*t4); 36 | do1f = mod4.*cos(2*pi*ScaleTable(5)*f0*t4); 37 | re1f = mod4.*cos(2*pi*ScaleTable(6)*f0*t4); 38 | mi1f = mod4.*cos(2*pi*ScaleTable(7)*f0*t4); 39 | fa1f = mod4.*cos(2*pi*ScaleTable(8)*f0*t4); 40 | so1f = mod4.*cos(2*pi*ScaleTable(9)*f0*t4); 41 | la1f = mod4.*cos(2*pi*ScaleTable(10)*f0*t4); 42 | tb1f = mod4.*cos(2*pi*ScaleTable(11)*f0*t4); 43 | ti1f = mod4.*cos(2*pi*ScaleTable(12)*f0*t4); 44 | do2f = mod4.*cos(2*pi*ScaleTable(13)*f0*t4); 45 | re2f = mod4.*cos(2*pi*ScaleTable(14)*f0*t4); 46 | mi2f = mod4.*cos(2*pi*ScaleTable(15)*f0*t4); 47 | fa2f = mod4.*cos(2*pi*ScaleTable(16)*f0*t4); 48 | so2f = mod4.*cos(2*pi*ScaleTable(17)*f0*t4); 49 | la2f = mod4.*cos(2*pi*ScaleTable(18)*f0*t4); 50 | ti2f = mod4.*cos(2*pi*ScaleTable(19)*f0*t4); 51 | do3f = mod4.*cos(2*pi*ScaleTable(20)*f0*t4); 52 | blkf = zeros(1,i); 53 | 54 | % 1/8 notes 55 | do0e = mod8.*cos(2*pi*ScaleTable(21)*f0*t8); 56 | fa0e = mod8.*cos(2*pi*ScaleTable(1)*f0*t8); 57 | so0e = mod8.*cos(2*pi*ScaleTable(2)*f0*t8); 58 | la0e = mod8.*cos(2*pi*ScaleTable(3)*f0*t8); 59 | ti0e = mod8.*cos(2*pi*ScaleTable(4)*f0*t8); 60 | do1e = mod8.*cos(2*pi*ScaleTable(5)*f0*t8); 61 | do1_6 = mod6.*cos(2*pi*ScaleTable(5)*f0*t6); 62 | re1e = mod8.*cos(2*pi*ScaleTable(6)*f0*t8); 63 | mi1e = mod8.*cos(2*pi*ScaleTable(7)*f0*t8); 64 | mi1_6= mod6.*cos(2*pi*ScaleTable(7)*f0*t6); 65 | fa1e = mod8.*cos(2*pi*ScaleTable(8)*f0*t8); 66 | fa1_6=mod6.*cos(2*pi*ScaleTable(8)*f0*t6); 67 | so1e = mod8.*cos(2*pi*ScaleTable(9)*f0*t8); 68 | so1_2= mod2.*cos(2*pi*ScaleTable(9)*f0*t2); 69 | so1_3= mod3.*cos(2*pi*ScaleTable(9)*f0*t3); 70 | la1e = mod8.*cos(2*pi*ScaleTable(10)*f0*t8); 71 | la1_6 = mod6.*cos(2*pi*ScaleTable(10)*f0*t6); 72 | tb1e = mod8.*cos(2*pi*ScaleTable(11)*f0*t8); 73 | ti1e = mod8.*cos(2*pi*ScaleTable(12)*f0*t8); 74 | do2e = mod8.*cos(2*pi*ScaleTable(13)*f0*t8); 75 | do2_4_25= mod4_25.*cos(2*pi*ScaleTable(13)*f0*t4_25); 76 | do2_6=mod6.*cos(2*pi*ScaleTable(13)*f0*t6); 77 | re2e = mod8.*cos(2*pi*ScaleTable(14)*f0*t8); 78 | re2_6 = mod6.*cos(2*pi*ScaleTable(14)*f0*t6); 79 | mi2e = mod8.*cos(2*pi*ScaleTable(15)*f0*t8); 80 | mi2_6 = mod6.*cos(2*pi*ScaleTable(15)*f0*t6); 81 | fa2e = mod8.*cos(2*pi*ScaleTable(16)*f0*t8); 82 | fa2_6 = mod6.*cos(2*pi*ScaleTable(16)*f0*t6); 83 | so2e = mod8.*cos(2*pi*ScaleTable(17)*f0*t8); 84 | la2e = mod8.*cos(2*pi*ScaleTable(18)*f0*t8); 85 | ti2e = mod8.*cos(2*pi*ScaleTable(19)*f0*t8); 86 | do3e = mod8.*cos(2*pi*ScaleTable(20)*f0*t8); 87 | blke = zeros(1,j); 88 | 89 | % 1/16 notes 90 | fa0s = mod16.*cos(2*pi*ScaleTable(1)*f0*t16); 91 | so0s = mod16.*cos(2*pi*ScaleTable(2)*f0*t16); 92 | la0s = mod16.*cos(2*pi*ScaleTable(3)*f0*t16); 93 | ti0s = mod16.*cos(2*pi*ScaleTable(4)*f0*t16); 94 | do1s = mod16.*cos(2*pi*ScaleTable(5)*f0*t16); 95 | re1s = mod16.*cos(2*pi*ScaleTable(6)*f0*t16); 96 | mi1s = mod16.*cos(2*pi*ScaleTable(7)*f0*t16); 97 | fa1s = mod16.*cos(2*pi*ScaleTable(8)*f0*t16); 98 | so1s = mod16.*cos(2*pi*ScaleTable(9)*f0*t16); 99 | la1s = mod16.*cos(2*pi*ScaleTable(10)*f0*t16); 100 | tb1s = mod16.*cos(2*pi*ScaleTable(11)*f0*t16); 101 | ti1s = mod16.*cos(2*pi*ScaleTable(12)*f0*t16); 102 | do2s = mod16.*cos(2*pi*ScaleTable(13)*f0*t16); 103 | re2s = mod16.*cos(2*pi*ScaleTable(14)*f0*t16); 104 | mi2s = mod16.*cos(2*pi*ScaleTable(15)*f0*t16); 105 | fa2s = mod16.*cos(2*pi*ScaleTable(16)*f0*t16); 106 | so2s = mod16.*cos(2*pi*ScaleTable(17)*f0*t16); 107 | la2s = mod16.*cos(2*pi*ScaleTable(18)*f0*t16); 108 | ti2s = mod16.*cos(2*pi*ScaleTable(19)*f0*t16); 109 | do3s = mod16.*cos(2*pi*ScaleTable(20)*f0*t16); 110 | blks = zeros(1,k); 111 | 112 | violin = [blke so1e... 113 | do2f ti1e do2s do2_4_25 blke do2e... 114 | do2e ti1e la1e ti1s la1_6 so1f so1e... 115 | so1f fa1e mi1s so1_3 so1e... 116 | so1e la1_6 re1e fa1s fa1_6 mi1f so1e... 117 | do2f ti1e do2s do2_4_25 blke do2e... 118 | do2e ti1e do2e re2s re2_6 do2e do2e ti1e... 119 | do2e do2s do2_6 ti1e ti1e la1e la1e ti1s la1s... 120 | so1_2 blkf so1e do2e... 121 | do2f mi1e la1e la1f so1e re2e... 122 | re2f re1e fa1s fa1_6 mi1e blke so1e... 123 | so1e fa1e fa1e mi1s mi1_6 re1e re1e do1e... 124 | mi1e re1f fa1e mi1f so1e do2e... 125 | do2f mi1e la1e la1e so1e so1e re2e... 126 | re2e re1e re1e fa1e mi1e so1e so1e mi2e... 127 | mi2e re2e re2e do2e do2e re2e do2e mi2e... 128 | mi2_6 re2_6 blke so1e ti1e do2s do2_4_25... 129 | blke do2e do2e la1e la1e so1e... 130 | ti1e do2e re2_6 do2_6 so1e ti1e do2s do2_4_25... 131 | blke do2e do2e la1e la1e so1e... 132 | re2e mi2e fa2_6 mi2_6 so1e ti1e do2s do2_4_25... 133 | blke do2e do2e la1e la1e so1e... 134 | re2e do2e ti1e do2s do2_6 blke do2e... 135 | do2e re2e re2e do2e do2e ti1e re2e do2s do2_6 136 | ]; 137 | 138 | s = violin; 139 | s = s/max(s); 140 | 141 | sound(s,fs); 142 | audiowrite('Qilixiang.wav',violin,fs) 143 | -------------------------------------------------------------------------------- /music/形容/code.m: -------------------------------------------------------------------------------- 1 | clear;clc 2 | Fs=8192; 3 | tone1=[5,1,2,... 4 | 3,1,5,2,2,1,2,1,2,2,1,2,1,2,2,2,2,3,2,1,6,1,... 5 | 5,5,1,6,1,6,1,1,5,5,7,7,7,7,7,1,2,2,2,1,1,... 6 | 1,5,1,3,4,3,2,2,1,... 7 | 5,1,3,4,3,2]; 8 | 9 | tone=tone1; 10 | 11 | rythm1=[0.5,0.5,0.5,... 12 | 1,1,1,2,0.5,0.5,1,0.5,0.5,0.5,0.5,1,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,... 13 | 1,1,0.5,0.5,0.5,0.5,1,1,1,1,1,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,1,... 14 | 1,0.5,0.5,1,1,1,1,2.5,1,... 15 | 1,1,1.5,1,1,2]; 16 | rythm=rythm1; 17 | 18 | length1=length(tone1); 19 | 20 | rythm_change_1=ones(1,length1)*1/3; 21 | 22 | rythm_change=rythm_change_1; 23 | rythm=rythm.*rythm_change; 24 | 25 | y=[]; 26 | len=length(tone); 27 | 28 | keynote_type=7; 29 | 30 | Soundzone_change=[2,3,3,... 31 | 3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,... 32 | 3,3,3,2,3,2,3,3,3,3,2,2,2,2,2,3,3,3,3,3,3,... 33 | 3,2,3,2,2,2,2,2,3,... 34 | 2,3,2,2,2,2]; 35 | up_down=2; 36 | for i=1:1:len 37 | y=[y,get_ware(tone(i),rythm(i),keynote_type,Soundzone_change(i),up_down)]; 38 | end 39 | 40 | sound(y,Fs) -------------------------------------------------------------------------------- /music/形容/get_ware.m: -------------------------------------------------------------------------------- 1 | function y=get_ware(tone, rythm,keynote_type,Soundzone_change,up_down) 2 | %tone为音节,rythm为节拍,keynote_type为当前基调默认为C调,keynote_change为改变基调,up_down为音节升降 3 | %Sound zone_change为改变音区; 4 | Fs=8192; 5 | freqs=[440*2.^(3/12),440*2^(5/12),440*2^(7/12),440*2^(8/12),440*2^(10/12),440*2^(12/12),440*2^(14/12)];%C调中音 6 | freqs=freqs*2.^((keynote_type-3)/12); 7 | freqs=freqs*2.^((Soundzone_change-2)*12/12); 8 | freqs=freqs*2.^((up_down-2)/12); 9 | x=linspace(0,2*pi*rythm,floor(Fs*rythm)); 10 | y=(sin(freqs(tone)*x).*(1-(x/(2*pi*rythm)))); 11 | end -------------------------------------------------------------------------------- /主成分分析/code.m: -------------------------------------------------------------------------------- 1 | %% 主成分分析 PCA 2 | %不要用于评价模型 3 | %可以用到聚类模型 4 | %可以帮助回归模型解决多重共线性的问题 5 | clc;clear 6 | load x.mat; 7 | [m,n]=size(x);%m个样本,n个指标 8 | %% 标准化处理 9 | X=zscore(x); 10 | %% 计算标准化矩阵的协方差矩阵 11 | R=cov(X); 12 | disp('相关系数矩阵:') 13 | disp(R) 14 | %% 计算协方差矩阵的特征向量和特征值 15 | [V,D]=eig(R);%V对应特征向量,D为对角阵对应特征值 16 | V=rot90(V)'; 17 | %% 计算主成分贡献率以及累计贡献率 18 | cv=diag(D);%得到D的对角线元素,即特征值 19 | cv=cv(end:-1:1); 20 | p=cv/n;%各指标贡献率 21 | sum_p=cumsum(p);%得到累计贡献率 22 | disp('贡献率:') 23 | disp(p') 24 | disp('累计贡献率') 25 | disp(sum_p') 26 | num=input('根据累计贡献率(参考值>0.8)时的主成分个数'); 27 | disp('得到的主成分的荷载是') 28 | disp(V(:,1:num)) 29 | out=x*V(:,1:num); -------------------------------------------------------------------------------- /主成分分析/x.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/主成分分析/x.mat -------------------------------------------------------------------------------- /人工神经网络/BP神经网络/code.m: -------------------------------------------------------------------------------- 1 | %% BP神经网络 2 | clc;clear 3 | load x.mat;%x是已知数据 4 | load y.mat;%y是因变量 5 | load predict_x.mat;%需要预测自变量 6 | 7 | 8 | %% 初始化 9 | temp=randperm(size(x,1));%随机打乱已知样本数据 10 | num=round(size(x,1)*0.8); 11 | train_x=x(temp(1:num),:)';%取40个训练样本 12 | train_y=y(temp(1:num),:)';%40个训练样本的输出 13 | test_x=x(temp(num+1:end),:)';%测试集合样本 14 | test_y=y(temp(num+1:end),:)';%测试集合的输出 15 | [m,n]=size(test_x); 16 | %% 数据归一化 17 | [train_x0,train_x1]=mapminmax(train_x,0,1);%将样本数据限制到【0,1】中 18 | 19 | test_x0=mapminmax('apply',test_x,train_x1); 20 | [train_y0,train_y1]=mapminmax(train_y,0,1); 21 | predict_x0=mapminmax('apply',predict_x',train_x1); 22 | corr_out=zeros(6,size(train_y0,1)); 23 | for j=5:10 24 | %% BP神经网络 25 | net = newff(train_x0,train_y0,j,{ 'logsig' 'purelin' },'traingda');%10为隐藏层神经元的层数 26 | net.trainParam.epochs = 2000; %迭代次数 27 | net.trainParam.goal = 1e-7; %mse均方根误差小于这个值训练结束 28 | net.trainParam.lr = 0.01; %学习率 29 | 30 | 31 | %开始训练 32 | net = train(net,train_x0,train_y0); 33 | disp('训练完成') 34 | %仿真 35 | out=sim(net,test_x0);%sim仿真函数根据训练结果给出值 36 | reverse_out= mapminmax('reverse',out,train_y1); 37 | disp('拟合完成') 38 | 39 | %% 效果测评 40 | p=reverse_out'; 41 | q=test_y'; 42 | for k=1:size(p,2)%因变量个数 43 | t=corr(p(:,k),q(:,k),'type','Spearman'); 44 | corr_out(j-4,k)=t; 45 | end 46 | end 47 | % %% 效果测评 48 | % % er=abs(reverse_out-test_y)./test_y;%相对误差 49 | % R2=wc(reverse_out,test_y); 50 | % %R2为决定系数 51 | % disp('真实值') 52 | % disp(test_y) 53 | % disp('拟合值') 54 | % disp(reverse_out) 55 | % % disp('相对误差') 56 | % % disp(er) 57 | % disp('拟合优度R²=') 58 | % disp(R2); 59 | %% 绘制图像 60 | reverse_out=round(reverse_out); 61 | reverse_out(reverse_out<0)=0; 62 | 63 | for i =1:size(reverse_out,1) 64 | figure 65 | plot(1:n,test_y(i,:),'b*',1:n,reverse_out(i,:),'rh') 66 | legend('True','Predict') 67 | xlabel('sample') 68 | ylabel('Times') 69 | if i==1 70 | title('1 try') 71 | elseif i==7 72 | title('7 or more tries (X)') 73 | else 74 | title([num2str(i) 'tries']) 75 | end 76 | end 77 | 78 | predict_y=sim(net,predict_x0);%predict_x转置 79 | predict_y=mapminmax('reverse',predict_y,train_y1); 80 | predict_y=round(predict_y)'; 81 | disp('预测值') 82 | disp(predict_y) 83 | 84 | % hold on 85 | % plot(n+1:n+size(predict_x,1),predict_y,'g-*') 86 | -------------------------------------------------------------------------------- /人工神经网络/BP神经网络/predict_x.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/人工神经网络/BP神经网络/predict_x.mat -------------------------------------------------------------------------------- /人工神经网络/BP神经网络/untitled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/人工神经网络/BP神经网络/untitled.png -------------------------------------------------------------------------------- /人工神经网络/BP神经网络/wc.m: -------------------------------------------------------------------------------- 1 | %% 拟合优度计算函数 2 | %R²是指拟合优度,是回归直线对观测值的拟合程度。 3 | function R2=wc(reverse_out,test_y) 4 | R2=1-(sum((test_y-reverse_out).^2))/(sum((test_y-mean(test_y)).^2)); 5 | end -------------------------------------------------------------------------------- /人工神经网络/BP神经网络/x.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/人工神经网络/BP神经网络/x.mat -------------------------------------------------------------------------------- /人工神经网络/BP神经网络/y.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/人工神经网络/BP神经网络/y.mat -------------------------------------------------------------------------------- /人工神经网络/BP神经网络/zs.m: -------------------------------------------------------------------------------- 1 | %% newff注释 2 | % net = newff(P,T,S) % 这两种定义都可以 3 | % net = newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF) 4 | % 1 5 | % 2 6 | %    P:输入参数矩阵。(RxQ1),其中Q1代表R元的输入向量。其数据意义是矩阵P有Q1列,每一列都是一个样本,而每个样本有R个属性(特征)。一般矩阵P需要归一化,即P的每一行都归一化到[0 1]或者[-1 1]。 7 | %   T:目标参数矩阵。(SNxQ2),Q2代表SN元的目标向量。 8 | %   S:N-1个隐含层的数目(S(i)到S(N-1)),默认为空矩阵[]。输出层的单元数目SN取决于T。返回N层的前馈BP神经网络 9 | %    TF:相关层的传递函数,默认隐含层为tansig函数,输出层为purelin函数。 10 | %   BTF:BP神经网络学习训练函数,默认值为trainlm函数。 11 | %   BLF:权重学习函数,默认值为learngdm。 12 | %   PF:性能函数,默认值为mse,可选择的还有sse,sae,mae,crossentropy。 13 | %   IPF,OPF,DDF均为默认值即可。 14 | %   例子: 15 | % 16 | % net = newff( input,output, [50] , { 'logsig' 'purelin' } , 'traingdx' ) ; 17 | % 1 18 | % 2,传递函数TF 19 | %   purelin: 线性传递函数。 20 | %   tansig :正切S型传递函数。 21 | %   logsig :对数S型传递函数。  22 | %   隐含层和输出层函数的选择对BP神经网络预测精度有较大影响,一般隐含层节点转移函数选用 tansig函数或logsig函数,输出层节点转移函数选用tansig函数或purelin函数。 23 | % 3,学习训练函数BTF 24 | %   traingd:最速下降BP算法。 25 | %   traingdm:动量BP算法。 26 | %   trainda:学习率可变的最速下降BP算法。 27 | %   traindx:学习率可变的动量BP算法。 28 | %   trainrp:弹性算法。 29 | %   变梯度算法: 30 | %     traincgf(Fletcher-Reeves修正算法) 31 | %      traincgp(Polak_Ribiere修正算法) 32 | %      traincgb(Powell-Beale复位算法) 33 | %      trainbfg(BFGS 拟牛顿算法) 34 | %      trainoss(OSS算法) 35 | % 36 | % 4,参数说明 37 | %   通过net.trainParam可以查看参数 38 | %    Show Training Window Feedback showWindow: true 39 | %    Show Command Line Feedback showCommandLine: false 40 | %    Command Line Frequency show: 两次显示之间的训练次数 41 | %   Maximum Epochs epochs: 训练次数 42 | %    Maximum Training Time time: 最长训练时间(秒) 43 | %    Performance Goal goal: 网络性能目标 44 | %    Minimum Gradient min_grad: 性能函数最小梯度 45 | %    Maximum Validation Checks max_fail: 最大验证失败次数 46 | %    Learning Rate lr: 学习速率 47 | %   Learning Rate Increase lr_inc: 学习速率增长值 48 | %   Learning Rate lr_dec: 学习速率下降值 49 | %    Maximum Performance Increase max_perf_inc: 50 | %    Momentum Constant mc: 动量因子 -------------------------------------------------------------------------------- /人工神经网络/BP神经网络/过程量.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/人工神经网络/BP神经网络/过程量.png -------------------------------------------------------------------------------- /人工神经网络/BP神经网络结合K折交叉验证/BV.m: -------------------------------------------------------------------------------- 1 | %% Bias+Variance 计算误差 需要输入训练集和测试集所有的值】 2 | %train_real 训练集真实值 3 | %train_hat 训练集拟合值 4 | %test_real 测试集真实值 5 | %test_hat 测试集拟合值 6 | %用的是测试集和训练集的MSE代数和 7 | function result=BV(train_real,train_hat,test_real,test_hat) 8 | Bias=sum((train_real-train_hat).^2)/max(size(train_hat));%默认样本数多于自变量个数 9 | Variance=sum((test_real-test_hat).^2)/max(size(test_hat)); 10 | 11 | result=sum(Bias)+sum(Variance); 12 | end -------------------------------------------------------------------------------- /人工神经网络/BP神经网络结合K折交叉验证/K.m: -------------------------------------------------------------------------------- 1 | %% K-交叉验证 2 | %制作数据集 3 | function x=K(data,k) 4 | [m,n]=size(data); 5 | temp=randperm(m);%随机打乱已知样本数据 6 | num=round(m/k); 7 | x=cell(k,1); 8 | for i=1:k-1 9 | x{i}=data(temp((i-1)*num+1:i*num),:); 10 | end 11 | x{k}=data(temp((i-1)*num+1:end),:); -------------------------------------------------------------------------------- /人工神经网络/BP神经网络结合K折交叉验证/code.m: -------------------------------------------------------------------------------- 1 | %% BP神经网络 结合K折交叉验证 2 | clc;clear 3 | 4 | load x.mat;%x是已知数据 5 | load y.mat;%y是因变量 6 | load predict_x.mat;%需要预测自变量 7 | while 1 8 | 9 | k=5;%交叉集个数 10 | k_net=cell(k,4);%第一列存放每个网络模型,第二列存放每个网络对应的Bias+Variance,第三列存放归一化x返回,第四列存放归一化y返回 11 | data=zeros(size(x,1),size(x,2)+size(y,2)); 12 | data(:,1:size(x,2))=x; 13 | data(:,size(x,2)+1:end)=y; 14 | k_data=K(data,k); 15 | for i=1:k 16 | %% 初始化 17 | test_x=(k_data{i}(:,1:size(x,2)))'; 18 | test_y=(k_data{i}(:,1+size(x,2):end))'; 19 | train_x=[]; 20 | train_y=[]; 21 | for j=1:k 22 | if i~=j 23 | train_x=cat(1,train_x,k_data{j}(:,1:size(x,2))); 24 | train_y=cat(1,train_y,k_data{j}(:,1+size(x,2):end)); 25 | end 26 | end 27 | train_x=train_x'; 28 | train_y=train_y'; 29 | [m,n]=size(test_x); 30 | %% 数据归一化 31 | [train_x0,train_x1]=mapminmax(train_x,0,1);%将样本数据限制到【0,1】中 32 | test_x0=mapminmax('apply',test_x,train_x1); 33 | [train_y0,train_y1]=mapminmax(train_y,0,1); 34 | 35 | %% BP神经网络 36 | net = newff(train_x0,train_y0,5,{ 'logsig' 'purelin' },'traingdx');%10为隐藏层神经元的层数 37 | 38 | net.trainParam.epochs = 1000; %迭代次数 39 | net.trainParam.goal = 1e-7; %mse均方根误差小于这个值训练结束 40 | net.trainParam.lr = 0.01; %学习率 41 | 42 | %开始训练 43 | net = train(net,train_x0,train_y0); 44 | disp('训练完成') 45 | %仿真 46 | out_train=sim(net,train_x0); 47 | reverse_train= mapminmax('reverse',out_train,train_y1); 48 | out=sim(net,test_x0);%sim仿真函数根据训练结果给出值 49 | reverse_out= mapminmax('reverse',out,train_y1); 50 | disp('拟合完成') 51 | 52 | %% 效果测评与记录 53 | k_net{i,1}=net; 54 | k_net{i,2}=BV(train_y',reverse_train',test_y,reverse_out); 55 | k_net{i,3}=train_x1; 56 | k_net{i,4}=train_y1; 57 | end 58 | %% 结果输出 59 | best=[1,k_net{1,2}];%记录最好模型的标号 60 | for i=2:k 61 | if k_net{i,2}=0为划分界限 5 | %% 初始化参数 6 | n=0;%正确划分点的个数 7 | a=0.1;%学习率 8 | i=0;%循环指针 9 | num=size(data); 10 | w=zeros(num(2),1); 11 | %得到多维w的界限 12 | %% 训练集和测试集的初始化 13 | num1=round(num(1)*0.8);%训练集个数 14 | train_x=data(1:num1,1:num(2)-1);%训练集x 15 | test_x=data(num1+1:num(1),1:num(2)-1);%测试集x 16 | train_y=data(1:num1,num(2));%训练集y 17 | test_y=data(num1+1:num(1),num(2));%测试集y 18 | %% 开始训练 19 | while n~=num1 20 | i=mod(i,num1); 21 | sum0=w(1);%硬限幅器的值 22 | for j=2:num(2) 23 | sum0=sum0+w(j)*train_x(i+1,j-1); 24 | end 25 | if sum0 >=0 %硬限幅器符合划分条件 26 | y=1; 27 | else 28 | y=-1; 29 | end 30 | if y==train_y(i+1) 31 | i=i+1; 32 | n=n+1; 33 | else 34 | %n=0; 35 | while y~=train_y(i+1) 36 | sum1=w(1);%硬限幅器的值 37 | for j=2:num(2) 38 | sum1=sum1+w(j)*train_x(i+1,j-1); 39 | end 40 | if sum1>=0 41 | y=1; 42 | else 43 | y=-1; 44 | end 45 | %更新权重 46 | w(1)=w(1)+a*(train_y(i+1)-y); 47 | for k=2:num(2) 48 | w(k)=w(k)+a*(train_y(i+1)-y)*train_x(i+1,k-1); 49 | end 50 | 51 | end 52 | judge_y=zeros(num1,1); 53 | for p=1:num1 54 | total=w(1); 55 | for q=2:size(w,1) 56 | total=total+w(q)*train_x(p,q-1); 57 | end 58 | if total>=0 59 | judge_y(p)=1; 60 | else 61 | judge_y(p)=-1; 62 | end 63 | end 64 | if sum(judge_y==train_y)/num1<0.83 65 | n=0; 66 | end 67 | end 68 | i=i+1; 69 | n=n+1; 70 | end 71 | 72 | disp('多维w的值为:') 73 | disp(w) 74 | 75 | %% 测试与评价 76 | test_y0=zeros(size(test_x,1),1);%初始化测试集的预测参数 77 | for p=1:size(test_x,1) 78 | sum2=w(1); 79 | for q=2:size(w,1) 80 | sum2=sum2+w(q)*test_x(p,q-1); 81 | end 82 | if sum2>=0 83 | test_y0(p)=1; 84 | else 85 | test_y0(p)=-1; 86 | end 87 | end 88 | correct=sum(test_y0==test_y)/size(test_x,1); 89 | disp('Rosenblatt感知机的预测准确率') 90 | disp([num2str(correct*100) '%']) 91 | disp('---------------分割线-----------------') 92 | 93 | %% 预测与输出 94 | load predict_x; 95 | predict_y=zeros(size(predict_x,1),1);%初始化预测的概率 96 | predict_y0=zeros(size(predict_x,1),1);%初始化预测的结果0 / 1 97 | for p=1:size(predict_x,1) 98 | sum3=w(1); 99 | for q=2:size(w,1) 100 | sum3=sum3+w(q)*test_x(p,q-1); 101 | end 102 | predict_y(p)=sum3; 103 | if sum3>=0 104 | predict_y0(p)=1; 105 | else 106 | predict_y0(p)=-1; 107 | end 108 | end 109 | disp('预测数据的概率是') 110 | disp(predict_y) 111 | disp('预测数据的结果是') 112 | disp(predict_y0) -------------------------------------------------------------------------------- /人工神经网络/Rosenblatt感知机/data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/人工神经网络/Rosenblatt感知机/data.mat -------------------------------------------------------------------------------- /人工神经网络/Rosenblatt感知机/predict_x.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/人工神经网络/Rosenblatt感知机/predict_x.mat -------------------------------------------------------------------------------- /决策树分类模型/code.m: -------------------------------------------------------------------------------- 1 | %% 决策树 CART 2 | %例如使用汽车特征评估质量的数据集 3 | %tips:数据集,包括车门数量、后备箱大小、维修成本、安全性能、载人数量等等(属性),来确定一辆汽车的质量。 4 | %分类的目的是把车辆的质量分为4种类型:不达标、达标、良好、优秀。 5 | 6 | clc;clear 7 | %量化属性指标,属性的效果越好值越高一般取1,2,3,... 8 | load target.mat%载入数据 9 | [m,n]=size(target); 10 | a=randperm(m);%将target随机赋值 11 | b=floor(m*0.8);%设置前b个为训练组 12 | %得到训练集合 13 | train=target(a(1:b),1:end-1);%前1:end为属性,end为质量的类型 14 | train_goal=target(a(1:b),end);%得到质量 15 | %得到测试集合 16 | test=target(a(b+1:end),1:end-1); 17 | test_goal=target(a(b+1:end),end); 18 | 19 | %% 创建决策树分类器 20 | tree = ClassificationTree.fit(train,train_goal); 21 | %实验组的分类 22 | tree_predict=predict(tree,test); 23 | %决策树的视图 24 | view(tree); 25 | view(tree,'mode','graph'); 26 | 27 | %% 模型检验与结果分析 28 | num_train1 = length(find(train_goal == 1)); %训练集中车辆质量不达标个数 29 | num_train2 = length(find(train_goal == 2)); %训练集中车辆质量达标个数 30 | num_train3 = length(find(train_goal == 3)); %训练集中车辆质量良好个数 31 | num_train4 = length(find(train_goal == 4)); %训练集中车辆质量优秀个数 32 | 33 | rata_train1 = num_train1 / b; %训练集中车辆质量不达标占的比例 34 | rata_train2 = num_train2 / b; %训练集中车辆质量达标占的比例 35 | rata_train3 = num_train3 / b; %训练集中车辆质量优良占的比例 36 | rata_train4 = num_train4 / b; %训练集中车辆质量优秀占的比例 37 | 38 | total_1 = length(find(target(:,end) == 1)); %总数据中车辆质量不达标个数 39 | total_2 = length(find(target(:,end) == 2)); %总数据中车辆质量达标个数 40 | total_3 = length(find(target(:,end) == 3)); %总数据中车辆质量优良个数 41 | total_4 = length(find(target(:,end) == 4)); %总数据中车辆质量优秀个数 42 | 43 | num_test1 = length(find(test_goal == 1)); %测试集中车辆质量不达标个数 44 | num_test2 = length(find(test_goal == 2)); %测试集中车辆质量达标个数 45 | num_test3 = length(find(test_goal == 3)); %测试集中车辆质量良好个数 46 | num_test4 = length(find(test_goal == 4)); %测试集中车辆质量优秀个数 47 | 48 | count_right_1 = length(find(tree_predict == 1 & test_goal == 1)); %测试集中预测车辆质量不达标正确的个数 49 | count_right_2 = length(find(tree_predict == 2 & test_goal == 2)); %测试集中预测车辆质量达标正确的个数 50 | count_right_3 = length(find(tree_predict == 3 & test_goal == 3)); %测试集中预测车辆质量优良正确的个数 51 | count_right_4 = length(find(tree_predict == 4 & test_goal == 4)); %测试集中预测车辆质量优秀正确的个数 52 | 53 | rate_right = (count_right_1+count_right_2+count_right_3+count_right_4)/(n-n); 54 | 55 | %% 输出 56 | %根据情况改变参数 57 | disp(['车辆总数:1728'... 58 | ' 不达标:' num2str(total_1)... 59 | ' 达标:' num2str(total_2)... 60 | ' 优良:' num2str(total_3)... 61 | ' 优秀:' num2str(total_4)]); 62 | disp(['训练集车辆数:1500'... 63 | ' 不达标:' num2str(num_train1)... 64 | ' 达标:' num2str(num_train2)... 65 | ' 优良:' num2str(num_train3)... 66 | ' 优秀:' num2str(num_train4)]); 67 | disp(['测试集车辆数:228'... 68 | ' 不达标:' num2str(num_test1)... 69 | ' 达标:' num2str(num_test2)... 70 | ' 优良:' num2str(num_test3)... 71 | ' 优秀:' num2str(num_test4)]); 72 | disp(['决策树判断结果:'... 73 | ' 不达标正确率:' sprintf('%2.3f%%', count_right_1/num_test1*100)... 74 | ' 达标正确率:' sprintf('%2.3f%%', count_right_2/num_test2*100)... 75 | ' 优良正确率:' sprintf('%2.3f%%', count_right_3/num_test3*100)... 76 | ' 优秀正确率:' sprintf('%2.3f%%', count_right_4/num_test4*100)]); 77 | 78 | disp(['总正确率:'... 79 | sprintf('%2.3f%%', rate_right*100)]); 80 | 81 | %% 优化前决策树的重采样误差和交叉验证误差 82 | resubDefault = resubLoss(tree); 83 | lossDefault = kfoldLoss(crossval(tree)); 84 | disp(['剪枝前决策树的重采样误差:'... 85 | num2str(resubDefault)]); 86 | disp(['剪枝前决策树的交叉验证误差:'... 87 | num2str(lossDefault)]); 88 | 89 | %% 剪枝 90 | [~,~,~,bestlevel] = cvLoss(tree,'subtrees','all','treesize','min'); 91 | cptree = prune(tree,'Level',bestlevel); 92 | view(cptree,'mode','graph') 93 | 94 | %% 剪枝后决策树的重采样误差和交叉验证误差 95 | resubPrune = resubLoss(cptree); 96 | lossPrune = kfoldLoss(crossval(cptree)); 97 | disp(['剪枝后决策树的重采样误差:'... 98 | num2str(resubPrune)]); 99 | disp(['剪枝后决策树的交叉验证误差:'... 100 | num2str(resubPrune)]); 101 | 102 | -------------------------------------------------------------------------------- /决策树分类模型/target.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/决策树分类模型/target.mat -------------------------------------------------------------------------------- /卡尔曼滤波/ck_code.m: -------------------------------------------------------------------------------- 1 | % Kalman filter example 2 | %% 系统描述: 3 | % 1.硬币直径真实值为50mm; 4 | % 2.开始时,硬币直径的估计为40mm,估计误差为5mm; 5 | % 3.尺子的测量误差为3mm; 6 | %% 变量初始化 7 | close all; 8 | clc;clear 9 | % intial parameters 10 | % 计算连续n_iter次数 11 | n_iter = 200; 12 | % size of array. n_iter行,1列 13 | sz = [n_iter, 1]; 14 | % 硬币直径的真实值 15 | x = 50; 16 | % 过程方差,反应连续两个次直径方差。更改查看效果 17 | Q = 0; 18 | % 测量方差,反应尺子的测量精度。更改查看效果 19 | R = 3; 20 | % z是尺子的测量结果,在真实值的基础上加上了方差为3的高斯噪声。 21 | z = x + sqrt(R)*randn(sz); 22 | %% 对数组进行初始化 23 | % 对直径的后验估计。即在k次,结合尺子当前测量值与k-1次先验估计,得到的最终估计值 24 | xhat = zeros(sz); 25 | % 后验估计的方差 26 | P = zeros(sz); 27 | % 直径的先验估计。即在k-1次,对k时刻直径做出的估计 28 | xhatminus = zeros(sz); 29 | % 先验估计的方差 30 | Pminus = zeros(sz); 31 | % 卡尔曼增益,反应了尺子测量结果与过程模型(即当前时刻与下一次直径相同这一模型)的可信程度 32 | K = zeros(sz); 33 | % intial guesses 34 | xhat(1) = 40; %直径初始估计值为40mm 35 | P(1) =10; % 误差方差为10 36 | %% kalman 方程 37 | for k = 2:n_iter 38 | % 时间更新(预测) 39 | % 用上一次的最优估计值来作为对本次的直径的预测 40 | xhatminus(k) = xhat(k-1); 41 | % 预测的方差为上一次直径最优估计值的方差与过程方差之和 42 | Pminus(k) = P(k-1)+Q; 43 | 44 | % 测量更新(校正) 45 | % 计算卡尔曼增益 46 | K(k) = Pminus(k)/( Pminus(k)+R ); 47 | % 结合当前时刻尺子的测量值,对上一次的预测进行校正,得到校正后的最优估计。该估计具有最小均方差 48 | xhat(k) = xhatminus(k)+K(k)*(z(k)-xhatminus(k)); 49 | % 计算最终估计值的方差 50 | P(k) = (1-K(k))*Pminus(k); 51 | end 52 | %% 作图 53 | FontSize = 14; 54 | LineWidth = 3; % 线宽 55 | figure(); 56 | plot(z,'r-*'); %画出尺子的测量值 57 | hold on; 58 | plot(xhat,'b-','LineWidth',LineWidth) %画出最优估计值 59 | hold on; 60 | plot(x*ones(sz),'g-','LineWidth',LineWidth); %画出真实值 61 | grid on; 62 | 63 | legend('尺子的测量结果', '后验估计', '真实值'); 64 | title('kalman 滤波','fontsize',FontSize); 65 | xl = xlabel('次数'); 66 | yl = ylabel('直径(mm)'); 67 | set(xl,'fontsize',FontSize); 68 | set(yl,'fontsize',FontSize); 69 | hold off; 70 | set(gca,'FontSize',FontSize);% gca:坐标轴序号 71 | 72 | figure(); 73 | valid_iter = 2:n_iter; % Pminus not valid at step 1 74 | % 画出最优估计值的方差 75 | plot(valid_iter,P(valid_iter),'LineWidth',LineWidth); 76 | grid on; 77 | 78 | legend('后验估计的误差估计'); 79 | title('最优估计值的方差','fontsize',FontSize); 80 | xl = xlabel('次数'); 81 | yl = ylabel('次数^2'); 82 | set(xl,'fontsize',FontSize); 83 | set(yl,'fontsize',FontSize); 84 | set(gca,'FontSize',FontSize); 85 | -------------------------------------------------------------------------------- /卡尔曼滤波/code2.m: -------------------------------------------------------------------------------- 1 | %% 自适应卡尔曼滤波 2 | %系统描述: 3 | %某一接收机的真实值已知状态为极坐标的两项参数,极长和角度 4 | %kalman_fun函数因为其中有随机的正态分布 每次输出的结果不一样但每次的精度都很高 5 | %循环10遍避免偶然因素发生 6 | clc;clear 7 | close all 8 | %当前值 9 | load data.mat 10 | %真实值 11 | load real.mat 12 | location=data(3:end,2:3);%初始,动态更新的2-9编号位置 13 | output=zeros(100,2+8*2);%输出 14 | j=0;%输出索引 15 | n=10; 16 | kalman_cell=cell(n,3); 17 | tic 18 | for t=1:n 19 | j=0; 20 | location=data(3:end,2:3); 21 | output=zeros(100,2+8*2); 22 | while 1 23 | loss=loss_fun1(location,real); 24 | [sort_loss,item]=sort(loss); %得到对应各个loss的编号item 25 | location1=[]; 26 | %3发射机 27 | for i=1:8 28 | if i~=item(1) 29 | location1=cat(1,location1,kalman_fun([0 0;100 0;location(item(1),:)],location(i,:),real,item(1),i)); 30 | else 31 | location1=cat(1,location1,location(item(1),:)); 32 | end 33 | end 34 | new_loss1=loss_fun1(location1,real); 35 | %4发射机 36 | location2=[]; 37 | for i=1:8 38 | if i~=item(1) && i~=item(2) 39 | location2=cat(1,location2,kalman_fun([0 0;100 0;location(item(2),:)],location(i,:),real,item(2),i)); 40 | else 41 | if i==item(1) 42 | location2=cat(1,location2,location(item(1),:)); 43 | else 44 | location2=cat(1,location2,location(item(2),:)); 45 | end 46 | end 47 | end 48 | %将发射机的位置重置 49 | location2=(location1+location2)./2; 50 | location2(item(1),:)=location(item(1),:); 51 | location2(item(2),:)=location(item(2),:); 52 | %判断优劣 53 | new_loss2=loss_fun1(location2,real); 54 | judge_loss=zeros(8,2); 55 | judge_loss(:,1)=new_loss1; 56 | judge_loss(:,2)=new_loss2; 57 | sum_loss=sum(judge_loss); 58 | if sum_loss(1)>sum_loss(2) 59 | flag=0; 60 | else 61 | flag=1; 62 | end 63 | %输出 64 | j=j+1; 65 | if flag==0 66 | out_item=[item(1),0]; 67 | location=location1; 68 | output(j,1:2)=out_item; 69 | for i=1:8 70 | output(j,2*i+1:2*i+2)=location(i,:); 71 | end 72 | 73 | else 74 | out_item=[item(1),item(2)]; 75 | location=location2; 76 | output(j,1:2)=out_item; 77 | for i=1:8 78 | output(j,2*i+1:2*i+2)=location(i,:); 79 | end 80 | end 81 | %退出循环 82 | break_loss=loss_fun1(location,real); 83 | if min(break_loss)<1e-4 84 | break; 85 | end 86 | end 87 | %删除多余项,整理输出 88 | output(j+1:end,:)=[]; 89 | i=2; 90 | while i<=size(output,1) %将两次发射机相同更改 91 | if sum(output(i,1:2)==output(i-1,1:2))==2 92 | a=output(1:i-2,:); 93 | b=output(i:end,:); 94 | output=[a;b]; 95 | end 96 | i=i+1; 97 | end 98 | %存储 99 | kalman_cell{t,1}=output; 100 | kalman_cell{t,2}=size(output,1); 101 | p=zeros(8,2); 102 | for i=1:8 103 | p(i,:)=output(end,2*i+1:2*i+2); 104 | end 105 | kalman_cell{t,3}=find(loss_fun1(p,real)==min(loss_fun1(p,real)))+1; 106 | end 107 | %打印结果 108 | min_item=1; 109 | for i=2:n 110 | if kalman_cell{min_item,2}>kalman_cell{i,2} 111 | min_item=i; 112 | end 113 | end 114 | disp(['得出较优的调整方案为第 ' num2str(min_item) ' 个方案']) 115 | disp(['其最精确的无人机编号为FY_0',num2str(kalman_cell{min_item,3})]); 116 | save_mat=kalman_cell{min_item,1}; 117 | save('save_mat','save_mat'); 118 | disp('结果输出完成') 119 | disp('结果注释:前两列为除了FY_00和FY_01选择的发射机,后几列每两列组成一组坐标依次表示编号2-9的无人机位置') 120 | toc -------------------------------------------------------------------------------- /卡尔曼滤波/data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/卡尔曼滤波/data.mat -------------------------------------------------------------------------------- /卡尔曼滤波/fan_angle.m: -------------------------------------------------------------------------------- 1 | function [out] = fan_angle(x,xp) 2 | 3 | %x是未知点,xp是三个点,a是第三个点的序号 4 | %% 求解out 5 | 6 | out(1) = abs(atand((x(1)*sind(x(2)))/(x(1)*cosd(x(2))))-atand((x(1)*sind(x(2)))/(x(1)*cosd(x(2))-100))); 7 | if out(1)>=90 8 | out(1)=180-out(1); 9 | end 10 | 11 | out(2) = abs(atand((x(1)*sind(x(2)))/(x(1)*cosd(x(2))))-atand((x(1)*sind(x(2))-xp(3,1)*sind(xp(3,2)))/(x(1)*cosd(x(2))-xp(3,1)*cosd(xp(3,2))))); 12 | if out(2)>=90 13 | out(2)=180-out(2); 14 | end 15 | 16 | 17 | out(3) = abs(atand((x(1)*sind(x(2))-xp(3,1)*sind(xp(3,2)))/(x(1)*cosd(x(2))-xp(3,1)*cosd(xp(3,2))))- atand((x(1)*sind(x(2)))/(x(1)*cosd(x(2))-100))); 18 | if out(3)>=90 19 | out(3)=180-out(3); 20 | elseif 0xp(3,2)&&x(2)<360&&xp(3,2)>180 23 | out(3)=180-out(3); 24 | end 25 | 26 | 27 | 28 | end 29 | 30 | 31 | -------------------------------------------------------------------------------- /卡尔曼滤波/judge.m: -------------------------------------------------------------------------------- 1 | %调整解集至合理位置 2 | function output=judge(out) 3 | if out(2)<0 4 | output(1)=180+out(1); 5 | output(2)=-out(2); 6 | else 7 | output=out; 8 | end -------------------------------------------------------------------------------- /卡尔曼滤波/kalman_fun.m: -------------------------------------------------------------------------------- 1 | %% 卡尔曼滤波的封装函数 2 | %launch_location是三发射机的位置 前两个固定是[FY_00,FY_01]的位置 3 | %accept_location是接收机的位置 4 | %real为真实位置 5 | %item为第三架发射机的编号-1 6 | %accept_item是接收机的编号-1 7 | function out=kalman_fun(launch_location,accept_location,real,item,accept_item) 8 | n=200;%卡尔曼滤波次数 9 | m=2;%状态量维度 10 | Q=[1e-5 0.01];%过程方差 11 | R=abs(launch_location(3,:)-real(item+2,2:3));%测量方差 12 | angle=fan_angle(accept_location,launch_location);%求解接收信息 13 | z=sqrt(abs(main_fun(angle,[1 item+1])-real(accept_item+2,2:3))).*randn(n,m)+real(accept_item+2,2:3); %模拟定位测量值 14 | x_hat=zeros(n,m);%后验估计 15 | P_x=zeros(n,m);%后验估计方差 16 | x_f=zeros(n,m);%先验估计 17 | P_f=zeros(n,m);%先验估计方差 18 | k=zeros(n,m);%卡尔曼增益 19 | x_hat(1,:)=accept_location; 20 | P_x(1,:)=abs(real(accept_item+2,2:end)-accept_location); 21 | %卡尔曼方程 22 | for epoch=2:n 23 | x_f(epoch,:)=x_hat(epoch-1,:); %更新先验估计 24 | P_f(epoch,:)=P_x(epoch-1,:)+Q;%更新先验估计方程 25 | k(epoch,:)=P_f(epoch,:)./(P_f(epoch,:)+R);%更新卡尔曼增益 26 | x_hat(epoch,:)=x_f(epoch,:)+k(epoch,:).*(z(epoch,:)-x_f(epoch,:));%更新后验估计 27 | P_x(epoch,:)=(1-k(epoch,:)).*P_f(epoch,:);%更新后验估计方差 28 | end 29 | out=x_hat(end,:);%最后的后验估计为输出值 30 | end -------------------------------------------------------------------------------- /卡尔曼滤波/loss_fun1.m: -------------------------------------------------------------------------------- 1 | %得到一个关于2-9号无人机距离真实值的偏差 2 | function loss=loss_fun1(y_hat,real) 3 | MSE=zeros(8,2); 4 | for i=1:8 5 | MSE(i,:)=(y_hat(i,:)-real(i+2,2:3)).^2; 6 | end 7 | guiyi=MSE./sum(MSE); 8 | loss=guiyi(:,1)+guiyi(:,2); 9 | end -------------------------------------------------------------------------------- /卡尔曼滤波/main_fun.m: -------------------------------------------------------------------------------- 1 | %此函数为根据输入参数进行定位的主要模型函数 2 | %输入angle为n*3的矩阵第一列是FY_00与FY_i发射线的夹角a1, 3 | %第二列是FY_00与FY_j发射线的夹角a2,第三列是FY_i与FY_j发射线的夹角a3 4 | %fly_item是n*2的矩阵第一列为发射机FY_i的编号第二列为发射机FY_j的编号 5 | %n为输入的样本数量 6 | function output=main_fun(angle,fly_item) 7 | eps=1e-3; 8 | need_angle=angle; 9 | d_angle=40*(fly_item(:,2)-fly_item(:,1)); %两架发射机与FY_00连线的夹角 10 | [m,n]=size(need_angle); 11 | r=100;%半径 12 | flag=zeros(m,1); 13 | for i=1:m 14 | if d_angle(i)>180 15 | d_angle(i)=360-d_angle(i); 16 | temp=need_angle(i,2); 17 | need_angle(i,2)=need_angle(i,1); 18 | need_angle(i,1)=temp; 19 | flag(i)=1;%标记两发射机大于180角的样本 20 | end 21 | end 22 | 23 | output=zeros(m,2); 24 | for i=1:m 25 | solve_angle=need_angle(i,:);%取出一个样本的角度 26 | a1=solve_angle(1); 27 | a2=solve_angle(2); 28 | a3=solve_angle(3); 29 | d=d_angle(i); 30 | if abs(a2-a3-a1)90 46 | out=fsolve(@(p)model1(p,a1,a2,r,d),[100,100]); 47 | out=judge(out); 48 | output(i,1)=out(2); 49 | output(i,2)=trans(out(1),flag(i),fly_item(i,:)); 50 | end 51 | end 52 | end 53 | % disp('模型计算完毕结果输出为output.mat每行对应每个样本输入的极坐标') 54 | -------------------------------------------------------------------------------- /卡尔曼滤波/model1.m: -------------------------------------------------------------------------------- 1 | function q=model1(p,a1,a2,r,d) 2 | x=p(1); 3 | l=p(2); 4 | q=[r/sind(a2)-l/sind(a2+d-x); 5 | r/sind(a1)-l/sind(a1+x)]; -------------------------------------------------------------------------------- /卡尔曼滤波/model2.m: -------------------------------------------------------------------------------- 1 | function q=model2(p,a1,a2,r,d) 2 | x=p(1); 3 | l=p(2); 4 | q=[r/sind(a2)-l/sind(x-d+a2); 5 | r/sind(a1)-l/sind(a1-x)]; -------------------------------------------------------------------------------- /卡尔曼滤波/model3.m: -------------------------------------------------------------------------------- 1 | function q=model3(p,a1,a2,r,d) 2 | x=p(1); 3 | l=p(2); 4 | q=[r/sind(a2)-l/sind(d+a2-x); 5 | r/sind(a1)-l/sind(a1-x)]; -------------------------------------------------------------------------------- /卡尔曼滤波/model4.m: -------------------------------------------------------------------------------- 1 | function q=model4(p,a1,a2,r,d) 2 | x=p(1); 3 | l=p(2); 4 | q=[r/sind(a2)-l/sind(x-d+a2); 5 | r/sind(a1)-l/sind(a1+x)]; -------------------------------------------------------------------------------- /卡尔曼滤波/real.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/卡尔曼滤波/real.mat -------------------------------------------------------------------------------- /卡尔曼滤波/save_mat.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/卡尔曼滤波/save_mat.mat -------------------------------------------------------------------------------- /卡尔曼滤波/trans.m: -------------------------------------------------------------------------------- 1 | %输出角度 2 | function out=trans(x,flag,item) 3 | if flag==0 4 | out=(item(1)-1)*40+x; 5 | else 6 | out=(item(2)-1)*40+x; 7 | end 8 | if out>=360 9 | out=out-360; 10 | elseif out<0 11 | out=out+360; 12 | end 13 | if abs(out-360)<1e-4||abs(out)<1e-4 %浮点输出限制 14 | out=0; 15 | end -------------------------------------------------------------------------------- /回归/GRP修改/GRP.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/回归/GRP修改/GRP.jpg -------------------------------------------------------------------------------- /回归/GRP修改/GRP.m: -------------------------------------------------------------------------------- 1 | %% 高斯过程回归GRP 2 | %r表示目标拟合优度 3 | %i表示第几个GRP模型 4 | function [y_predict]=GRP(data,x_predict) 5 | 6 | x=data(:,1);%自变量 6个输入 7 | y=data(:,end);%因变量数据集 8 | temp=randperm(size(x,1));%随机打乱已知样本数据 9 | num=round(size(x,1)*0.8); 10 | train_x=x(temp(1:num),:);%取m*0.8个训练样本 11 | train_y=y(temp(1:num),:);%训练样本的输出 12 | test_x=x(temp(num+1:end),:);%测试样本 13 | test_y=y(temp(num+1:end),:);%测试样本输出 14 | 15 | %归一化去量纲 16 | [train_x0,P1]=mapminmax(train_x',0,1); 17 | train_x0=train_x0'; 18 | [train_y0,P2]=mapminmax(train_y',0,1); 19 | train_y0=train_y0'; 20 | test_x0=mapminmax('apply',test_x',P1)'; 21 | 22 | test_y0=mapminmax('apply',test_y',P2)'; 23 | %模型训练 24 | yi=train_y0(:,1); 25 | gprMdl = fitrgp(train_x0,yi,'Basis','pureQuadratic',... 26 | 'FitMethod','exact','PredictMethod','exact'); 27 | %测试集检验 28 | test_predict=predict(gprMdl,test_x0); 29 | disp(MSEloss(test_y0,test_predict)); 30 | %输出预测值 31 | out=predict(gprMdl,mapminmax('apply',x_predict',P1)');%2*1 32 | out1=mapminmax('reverse',out',P2)';%2*4 33 | y_predict=out1(:,1);%第i列数据 34 | img(data(:,1),data(:,2),y_predict,P1,P2,gprMdl); 35 | end 36 | -------------------------------------------------------------------------------- /回归/GRP修改/MSEloss.m: -------------------------------------------------------------------------------- 1 | function out=MSEloss(true,predict) 2 | out=sum((true-predict).^2)/size(true,1); 3 | end -------------------------------------------------------------------------------- /回归/GRP修改/code.m: -------------------------------------------------------------------------------- 1 | %% 高斯过程回归GRP 2 | clc;clear; 3 | load data.mat;%第一列为自变量(日期),第二列为因变量(销售额) 4 | load x_predict;%预测自变量 5 | [m,n]=size(x_predict); 6 | result=zeros(m,1); 7 | y_predict=GRP(data,x_predict); 8 | -------------------------------------------------------------------------------- /回归/GRP修改/data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/回归/GRP修改/data.mat -------------------------------------------------------------------------------- /回归/GRP修改/img.m: -------------------------------------------------------------------------------- 1 | function []=img(x,true,predict_y,P1,P2,gprMdl) 2 | x=mapminmax('apply',x',P1)'; 3 | true1=mapminmax('apply',true',P2)'; 4 | y=predict(gprMdl,x); 5 | yhat=mapminmax('reverse',y',P2)'; 6 | predict_y=cat(1,yhat(end),predict_y); 7 | disp(['MSEloss=' num2str(MSEloss(true1,y))]) 8 | figure() 9 | hold on 10 | plot(0:size(x,1)-1,true,'b-','linewidth',1) 11 | plot(0:size(x,1)-1,yhat,'g-','linewidth',1) 12 | plot(size(x,1)-1:size(x,1)+size(predict_y,1)-2,predict_y,'r-','linewidth',1) 13 | xlabel('Date') 14 | ylabel('SolePrice') 15 | legend('True','Test','Predict') 16 | end 17 | -------------------------------------------------------------------------------- /回归/GRP修改/x_predict.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/回归/GRP修改/x_predict.mat -------------------------------------------------------------------------------- /回归/线性回归/code.m: -------------------------------------------------------------------------------- 1 | %% 多元线性回归方程 2 | % load x0.mat;%载入数据通常是自变量 3 | x1=[1.376 1.375 1.387 1.401 1.412 1.428 1.445 1.477] 4 | x2=[0.450 0.475 0.485 0.500 0.535 0.545 0.550 0.575] 5 | x3=[2.170 2.552 2.676 2.713 2.823 3.088 3.122 3.262] 6 | y0=[5.19 5.30 5.60 5.82 6.00 5.06 6.45 6.95]';%因变量 7 | n=length(x1);%数据长度 8 | x=[ones(n,1) x1' x2' x3']%合成列向量 9 | 10 | 11 | %% 执行回归命令 12 | [coef,bint,r,rint,stats]=regress(y0,x);%得出来的coef是自变量系数以及常数项 第一个是常数 另外的分别是xi 13 | %bint输出回归系数的区间估计 14 | %r输出残差 15 | %rint输出置信区间 16 | %用于检验回归模型的统计量。有4个数值:判定系数R^2,F统计量观测值,检验的p的值,误差方差的估计。 17 | if stats(3)>0.05 18 | disp('回归模型不显著') 19 | else 20 | disp('回归模型显著') 21 | end 22 | %% 残差分析图 23 | rcoplot(r,rint) 24 | title('残差分析图的绘制'); 25 | xlabel('数据'); 26 | ylabel('残差'); 27 | 28 | %% 回归模型 29 | hg=coef(1)+coef(2)*x1+coef(3)*x2+coef(4)*x3%按具体情况修改 30 | 31 | -------------------------------------------------------------------------------- /回归/线性回归/data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/回归/线性回归/data.mat -------------------------------------------------------------------------------- /回归/逻辑回归/code.m: -------------------------------------------------------------------------------- 1 | %% 逻辑回归 2 | clc;clear 3 | 4 | load data.mat;%载入数据 5 | [m,n]=size(data); 6 | temp=randperm(size(data,1));%随机打乱已知样本数据 7 | num=round(size(data,1)*0.8);%80%的数据分为训练组 8 | train_x=data(temp(1:num),1:n-1);%训练组的x 9 | train_y=data(temp(1:num),n);%训练组的y 10 | test_x=data(temp(num+1:m),1:n-1);%测试组的x 11 | test_y=data(temp(num+1:m),n);%测试组的y 12 | 13 | chef=glmfit(train_x,train_y,'binomial','logit');%得到回归系数 14 | 15 | %% 模型评价 16 | test_y0=zeros(size(test_x,1),1);%初始化预测的概率1200*1 17 | test=zeros(size(test_x,1),1);%初始化预测的结果1200*1 18 | for i=1:size(test_x,1) 19 | sum0=chef(1); 20 | for j=2:n 21 | sum0=sum0+chef(j)*test_x(i,j-1); 22 | end 23 | %sum0=chef(1)+text_x(i,:)*chef(2:end); 24 | test_y0(i)=sigmoid(sum0); 25 | if test_y0(i)>=0.5 26 | test(i)=1; 27 | else 28 | test(i)=0; 29 | end 30 | end 31 | 32 | correct=sum(test==test_y)/size(test_x,1); 33 | disp('模型准确率为:') 34 | disp([num2str(correct*100) '%']) 35 | 36 | disp('-----------分割线------------') 37 | %% 开始预测 38 | load predict_x.mat; 39 | predict_y=zeros(size(predict_x,1),1);%初始化预测概率 40 | predict=zeros(size(predict_x,1),1);%初始化预测结果 41 | for i=1:size(predict_x,1) 42 | sum0=chef(1); 43 | for j=2:n 44 | sum0=sum0+chef(j)*predict_x(i,j-1); 45 | end 46 | predict_y(i)=sigmoid(sum0); 47 | if predict_y(i)>=0.5 48 | predict(i)=1; 49 | else 50 | predict(i)=0; 51 | end 52 | end 53 | disp('预测概率为:') 54 | disp(predict_y) 55 | disp('预测结果为') 56 | disp(predict) 57 | 58 | -------------------------------------------------------------------------------- /回归/逻辑回归/data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/回归/逻辑回归/data.mat -------------------------------------------------------------------------------- /回归/逻辑回归/predict_x.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/回归/逻辑回归/predict_x.mat -------------------------------------------------------------------------------- /回归/逻辑回归/sigmoid.m: -------------------------------------------------------------------------------- 1 | %% sigmod函数 2 | function y=sigmoid(x) 3 | y=1./(1+exp(-x)); 4 | end -------------------------------------------------------------------------------- /回归/非线性回归/code.m: -------------------------------------------------------------------------------- 1 | %% 一元非线性回归模型 2 | clc;clear 3 | %% 绘制散点图并分析走势 4 | load data.mat; 5 | x=data(:,2); 6 | y=data(:,3); 7 | figure; 8 | plot(x,y,'ko');%绘制散点图 9 | xlabel('周目'); 10 | ylabel('供货偏差');%具体的标签需要自己改 11 | %% 根据散点图的走势,确定回归方程的具体形式,对参数个数进行设定和设定初始值 12 | %建立一元非线性回归方程 13 | fun=@(beta,x)beta(1)./(1-beta(2)*x);%根据散点图趋势建立方程f(x)=b1./(1-b2*x),方程形式并不唯一。***** 14 | beta0=[120,0.008];%beta0为b1,b2的初始值。 15 | opt=statset;%创建结构体变量类 16 | opt.Robust='on';%开启回归稳健性方法 17 | way1=NonLinearModel.fit(x,y,fun,beta0,'Options',opt); 18 | %% 调用NonLinearModel的fit方法进行模型拟合 19 | newx=linspace(20,40,50)'; 20 | ynew=way1.predict(newx);%进行预测 21 | figure; 22 | plot(x,y,'ko'); 23 | hold on; 24 | plot(newx,ynew,'linewidth',2); 25 | xlabel('周目'); 26 | ylabel('供货偏差'); 27 | legend('原始数据散点','非线性回归曲线'); 28 | %% 模型改进,去除异常值的操作; 29 | Res2=way1.Residuals; 30 | Res_Stu2=Res2.Studentized; 31 | id2=find(abs(Res_Stu2)>2); 32 | %去除异常值重新构建回归模型 33 | way2=NonLinearModel.fit(x,y,fun,beta0,'Exclude',id2,'options',opt); 34 | %% 画出新图 35 | newx=linspace(20,40,50)'; 36 | y1=way1.predict(newx); 37 | y2=way2.predict(newx); 38 | figure; 39 | plot(x,y,'ko'); 40 | hold on; 41 | plot(newx,y1,'r--','linewidth',2); 42 | plot(newx,y2,'b.','linewidth',2); 43 | xlabel('周目'); 44 | ylabel('供货偏差'); 45 | legend('原始数据散点','回归曲线','去除异常值后的回归曲线'); 46 | %% 进行残差分析,验证模型。 47 | 48 | %回归诊断 49 | figure; 50 | subplot(1,2,1); 51 | way1.plotResiduals('histogram'); 52 | title('(a)残差直方图'); 53 | xlabel('残差r'); 54 | ylabel('f(r)'); 55 | subplot(1,2,2); 56 | way1.plotResiduals('probability'); 57 | title('(b)残差正态概率图'); 58 | xlabel('残差'); 59 | ylabel('概率'); 60 | 61 | 62 | -------------------------------------------------------------------------------- /回归/非线性回归/data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/回归/非线性回归/data.mat -------------------------------------------------------------------------------- /回归/高斯过程回归/GRP.m: -------------------------------------------------------------------------------- 1 | %% 高斯过程回归GRP 2 | %r表示目标拟合优度 3 | %i表示第几个GRP模型 4 | function [y_predict,r0]=GRP(r,i) 5 | while 1 6 | load data.mat;%data数据样本前1:6个为自变量,7:10为输出因变量 7 | load x_predict;%预测自变量 8 | [m,n]=size(x_predict); 9 | y_predict=zeros(m,1);%初始化输出,4个输出 10 | x=data(:,1:6);%自变量 6个输入 11 | y=data(:,7:end);%因变量数据集 12 | temp=randperm(size(x,1));%随机打乱已知样本数据 13 | num=round(size(x,1)*0.8); 14 | train_x=x(temp(1:num),:);%取m*0.8个训练样本 15 | train_y=y(temp(1:num),:);%训练样本的输出 16 | test_x=x(temp(num+1:end),:);%测试样本 17 | test_y=y(temp(num+1:end),:);%测试样本输出 18 | 19 | %归一化去量纲 20 | [train_x0,P1]=mapminmax(train_x',0,1); 21 | train_x0=train_x0'; 22 | [train_y0,P2]=mapminmax(train_y',0,1); 23 | train_y0=train_y0'; 24 | test_x0=mapminmax('apply',test_x',P1)'; 25 | 26 | test_y0=mapminmax('apply',test_y',P2)'; 27 | %模型训练 28 | yi=train_y0(:,i); 29 | gprMdl = fitrgp(train_x0,yi,'Basis','pureQuadratic',... 30 | 'FitMethod','exact','PredictMethod','exact'); 31 | %测试集检验 32 | test_predict=predict(gprMdl,test_x0); 33 | r0 =wc(test_predict,test_y0(:,i),n);%拟合优度 34 | 35 | if r0>r 36 | break; 37 | end 38 | end 39 | img(gprMdl,train_x0,i,P2); 40 | disp(['模型' num2str(i) '训练完成,其测试集修正拟合优度为']) 41 | disp([ 'R²_adjusted=' num2str(r0)]) 42 | % img(gprMdl,mapminmax('apply',x_predict',P1)',i); 43 | %输出预测值 44 | out=predict(gprMdl,mapminmax('apply',x_predict',P1)');%2*1 45 | out1=mapminmax('reverse',out',P2)';%2*4 46 | y_predict=out1(:,i);%第i列数据 47 | end 48 | -------------------------------------------------------------------------------- /回归/高斯过程回归/code.m: -------------------------------------------------------------------------------- 1 | %% 高斯过程回归GRP 2 | clc;clear; 3 | load data.mat;%data数据样本前1:6个为自变量,7:10为输出因变量 4 | load x_predict;%预测自变量 5 | [m,n]=size(x_predict); 6 | result=zeros(m,4);%四个模型输出 7 | model_test=zeros(4,1); 8 | for i=1:4 9 | [result(:,i),model_test(i)]=GRP(0.8,i); 10 | end 11 | -------------------------------------------------------------------------------- /回归/高斯过程回归/data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/回归/高斯过程回归/data.mat -------------------------------------------------------------------------------- /回归/高斯过程回归/img.m: -------------------------------------------------------------------------------- 1 | %% 画图 2 | function []=img(gprMdl,train_x0,i,P2) 3 | [pred,~,ci] = predict(gprMdl,train_x0); 4 | xtest=1:size(train_x0,1); 5 | pred1=mapminmax('reverse',pred',P2)';%2*4 6 | pred=pred1(:,i); 7 | ci1=mapminmax('reverse',ci(:,1)',P2)'; 8 | ci2=mapminmax('reverse',ci(:,2)',P2)'; 9 | ci(:,1)=ci1(:,i); 10 | ci(:,2)=ci2(:,i); 11 | figure 12 | plot(xtest,pred,'r','DisplayName','Prediction'); 13 | hold on; 14 | plot(xtest,ci(:,1),'c','DisplayName','Lower 95% Limit'); 15 | plot(xtest,ci(:,2),'k','DisplayName','Upper 95% Limit'); 16 | legend('show','Location','Best'); 17 | end 18 | -------------------------------------------------------------------------------- /回归/高斯过程回归/wc.m: -------------------------------------------------------------------------------- 1 | %% 拟合优度计算函数 2 | %R²是指调整后的拟合优度,是回归直线对观测值的拟合程度。 3 | 4 | function R2=wc(reverse_out,test_y,k) 5 | R2=1-(sum((reverse_out-test_y).^2)/(size(reverse_out,1)-k-1))/(sum((mean(test_y)-test_y).^2)/(size(reverse_out,1)-1)); 6 | end -------------------------------------------------------------------------------- /回归/高斯过程回归/x_predict.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/回归/高斯过程回归/x_predict.mat -------------------------------------------------------------------------------- /因子分析/code.m: -------------------------------------------------------------------------------- 1 | %% 因子分析 2 | clc;clear 3 | load data.mat 4 | traindata=data(:,2:end); 5 | [lambda,psi,T,stats] = factoran(traindata,4); 6 | disp('因子荷载矩阵lambda:') 7 | disp(lambda) 8 | disp('特殊方差矩阵的估计psi:') 9 | disp(psi) 10 | disp('模型检验信息stats:') 11 | disp(stats) 12 | Contribut = 100*sum(lambda.^2)/8; 13 | CumCont = cumsum(Contribut); %计算累积贡献率 14 | disp('贡献率Contribut:') 15 | disp(Contribut) 16 | disp('累计贡献率CumCont:') 17 | disp(CumCont) 18 | % 19 | Fc=traindata*lambda;%因子矩阵 20 | Fc1=Fc(:,2:end)-Fc(:,1); 21 | Fc1=(Fc1-min(Fc1))./(max(Fc1)-min(Fc1));%归一化 22 | Q=sum(abs(Fc1-mean(Fc1)),2); 23 | range=mean(Q)+std(Q)*1.645;%单边检验范围 24 | -------------------------------------------------------------------------------- /因子分析/data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/因子分析/data.mat -------------------------------------------------------------------------------- /层次分析/x.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/层次分析/x.mat -------------------------------------------------------------------------------- /层次分析/层次分析.m: -------------------------------------------------------------------------------- 1 | load x.mat%加载判断矩阵 2 | x=[1 2/5 1/5 6/5 7/5 8/5; 5/2 11/2 6/2 7/2 8/2;5 2 1 6 7 8; 5/6 2/6 1/6 1 7/6 8/6; 5/7 2/7 1/7 6/7 1 8/7; 5/8 2/8 1/8 6/8 7/8 1] 3 | 4 | 5 | [n,n]=size(x); 6 | %% 一致性检验 7 | [a,b]=eig(x); 8 | bmax=max(max(b)); 9 | ci=(bmax-n)/(n-1) 10 | ri=[0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59]; 11 | disp('一致性指标CI=');disp(ci); 12 | cr = ci/ri(n); 13 | disp('一致性比例CR=');disp(cr); 14 | if cr<0.1 15 | disp('符合一致性检验') 16 | else 17 | disp('不符合一致性检验,修正判断矩阵') 18 | end 19 | %% 特征值法计算权重矩阵 20 | [r,c] = find(b==bmax , 1); 21 | disp('特征值法求权重的结果为:'); 22 | m= a(:,c) ./ sum(a(:,c)); 23 | disp( m )%m为归一化后的权重 24 | -------------------------------------------------------------------------------- /微分方程/人口预报模型/code.m: -------------------------------------------------------------------------------- 1 | %% 人口预报模型 2 | clc; 3 | clear; 4 | load x.mat %该程序规定x第一列为年份(自变量),第二列为人数(因变量) 5 | %非线性最小二乘估计(以第一个数据作为初始条件) 6 | population=x(:,2); 7 | year=x(:,1); 8 | t0=year(1); 9 | x0=population(1); 10 | fun=@(cs,td)cs(1)./(1+(cs(1)/x0-1)*exp(-cs(2)*(td-t0)));%cs(1)为人口最大环境容量cs(2)为增长率r 11 | cs=lsqcurvefit(fun,rand(2,1),t(2:end-1),x0(2:end-1),zeros(2,1));%2:end-1的数据作为训练组 12 | %lsqcurvefit(函数,随机初值,训练自变量,训练因变量,大小)用于非线性最小二乘估计 13 | project_year=2022:2027; 14 | project_population=fun(cs,project_year);%带入模型得出数据 15 | disp([project_year '的人口预测数据为' project_population]) 16 | disp('最大人口容量population_max为') 17 | disp(cs(1)) 18 | %模型检验 19 | p0=fun(cs,year(end)); 20 | disp("该模型的离差平方和(SST)为") 21 | disp(p0) 22 | 23 | %画图 24 | grid on 25 | hold on 26 | plot(year,population,'b*',year,fun(cs,year),'g-',project_year,project_populaton,'r-') 27 | legend(['ever','future']); -------------------------------------------------------------------------------- /微分方程/人口预报模型/x.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/微分方程/人口预报模型/x.mat -------------------------------------------------------------------------------- /微分方程/微分方程库函数解析构建/code.m: -------------------------------------------------------------------------------- 1 | %% MATLAB微分方程常用库函数的构建 2 | %符号解 3 | % syms y(x)_定义符号变量表明y是x的函数 4 | % [y1,y2...,yn]=desolve(符号微分方程或微分方程组,初值条件或者边界条件,可选的成对参数) 5 | % diff(y,n)符号变量y的n阶偏导 6 | %simplify(f)对符号解进行化简 7 | 8 | %初值问题的MATLAB数值解 9 | %RK方法解微分方程(ode23,ode45,ode113) 10 | %[t,y]=solver('F',tspan,y0) 11 | %其中solver为(ode23,ode45,ode113)其中之一 12 | %'F'为微分方程组,tspan是[t0,tfinal]求解区间,y0是初值返回值可以是一个值,返回一个值是结构体数组可以通过deval计算任意一点函数值 13 | clc;clear 14 | yx=@(x,y) -2*y+2*x^2+2*x; 15 | [x,y]=ode45(yx,[0.5,1],1); 16 | sol=ode45(yx,[0.5,1],1); 17 | y2=deval(sol,x); 18 | check=[y,y2']; 19 | 20 | %边界问题的MATLAB数值解 21 | %sol=bvp4c(@odefun,@bcfun,solinit,options,p1,p2,...) 22 | %odefun格式 yprime=odefun(x,y,p1,p2,...) 23 | %bcfung格式 res=bcfun(ya,yb,p1,p2,...) 24 | %详见《数学建模算法与应用》 -------------------------------------------------------------------------------- /投影寻踪综合评价/D.m: -------------------------------------------------------------------------------- 1 | %% 求解Da 2 | function da = D(z) 3 | % R = r_m+3; 4 | n = size(z,1);%默认为是一行n列 5 | sum0 = 0; 6 | r=zeros(n); 7 | for i = 1:n 8 | for k = 1:n 9 | r(i,k) = abs(z(i)-z(k)); 10 | % sum0 = sum0+(R-r(i,k))*fun(R-r(i,k)); 11 | end 12 | end 13 | 14 | R = rand*(max(max(r))/3-max(max(r))/5)+max(max(r))/5; 15 | 16 | 17 | 18 | for i = 1:n 19 | for k = 1:n 20 | sum0 = sum0+(R-r(i,k))*fun(R-r(i,k)); 21 | end 22 | end 23 | 24 | da = sum0; 25 | end 26 | -------------------------------------------------------------------------------- /投影寻踪综合评价/S.m: -------------------------------------------------------------------------------- 1 | %% 求解Sa 2 | function S_a = S(z) 3 | % 此求S(a) 4 | n = size(z,1);%n行一列 5 | z_mean = sum(z)/n; 6 | S_a = sqrt( 1/n*(sum((z-z_mean).^2)) ); 7 | 8 | end 9 | -------------------------------------------------------------------------------- /投影寻踪综合评价/code.m: -------------------------------------------------------------------------------- 1 | %% 遗传算法 GA 采用浮点数编码 2 | %得到最好的a值 3 | clc;clear 4 | load data.mat; 5 | 6 | 7 | %% 初始化参数 8 | n=500;%种群数目 9 | ger=1000;%迭代次数,总共有多少代 10 | var=0.2;%变异概率 11 | acr=0.4;%交叉概率 12 | 13 | n_chr=4;%染色体个数,自变量个数 14 | %length_chr=10;%精度,二进制编码长度,染色体内基因个数 (这里不需要) 15 | range_chr=[0 1];%自变量的取值范围*** 16 | 17 | best_fitness=zeros(1,ger);%存放每一代的最优适应度 18 | ave_fitness=zeros(1,ger);%存放每一代的平均适应度 19 | 20 | %% 初始化第一代solvevar(chr,var,n,n_chr,range_chr,i,ger) 21 | chr=ys(n,n_chr);%存放个体的染色体 22 | fitness=solvefit(chr,n,data);%计算适应度 23 | best_fitness(1)=max(fitness); %将当前最优存入矩阵当中 24 | ave_fitness(1)=mean(fitness);%将当前平均适应度存入矩阵当中 25 | best_chr=findbest_chr(chr,fitness,n_chr);%存放最优染色体和适应度前n_chr个是染色体,n_chr+1是适应度 26 | %% 开始遗传 27 | for i=2:ger 28 | chr=solveacr(chr,acr,n,n_chr);%交叉过程 29 | chr=solvevar(chr,var,n,n_chr,range_chr,i,ger);%变异处理 30 | fitness=solvefit(chr,n,data);%计算适应度 31 | best=findbest_chr(chr,fitness,n_chr); 32 | if best_chr(end)= 0 4 | f =1; 5 | else 6 | f = 0; 7 | end 8 | end -------------------------------------------------------------------------------- /投影寻踪综合评价/judge.m: -------------------------------------------------------------------------------- 1 | %% 判断变异后是否超出边界 2 | function out=judge(in,range) 3 | if inrange(2) 4 | if abs(in-range(1))1.1||sum(newchr(i,:).^2)<0.9 16 | newchr(i,:)=ys(1,n_chr); 17 | end 18 | end 19 | end -------------------------------------------------------------------------------- /投影寻踪综合评价/solvefit.m: -------------------------------------------------------------------------------- 1 | %% 适应度计算 2 | function fitness=solvefit(chr,n,data) 3 | fitness=zeros(n,1);%初始化适应度 4 | 5 | for i=1:n 6 | z=std(data,chr(i,:)); 7 | fitness(i)=S(z)*D(z); 8 | end 9 | 10 | end -------------------------------------------------------------------------------- /投影寻踪综合评价/solvevar.m: -------------------------------------------------------------------------------- 1 | %% 变异过程 对所有单个个体进行变异处理 2 | function newchr=solvevar(chr,var,n,n_chr,range_chr,i,ger) 3 | for j=1:n 4 | for k=1:n_chr 5 | p=rand; 6 | if p1.1||sum(newchr(i,:).^2)<0.9 21 | newchr(i,:)=ys(1,n_chr); 22 | end 23 | end 24 | end -------------------------------------------------------------------------------- /投影寻踪综合评价/solveworse.m: -------------------------------------------------------------------------------- 1 | %% 替换劣等解 2 | function [newchr,newfitness]=solveworse(chr,best_chr,fitness) 3 | max0=max(fitness); 4 | min0=min(fitness); 5 | lim=(max0-min0)*0.2+min0;%限制适应度:淘汰最后20%的个体 6 | replace=fitness1 12 | 13 | continue; 14 | else 15 | k=k+1; 16 | a(n_chr)=sqrt(1-sum0); 17 | out_a=cat(1,out_a,a); 18 | end 19 | end 20 | 21 | end 22 | -------------------------------------------------------------------------------- /支持向量机/code.m: -------------------------------------------------------------------------------- 1 | %% 支持向量机SVM 分类模型之一 2 | clc;clear 3 | load data.mat %得到数据 4 | [m,n]=size(data); %得到行数和列数 5 | temp=randperm(m);%打乱数据 6 | num=round(m*0.8);%训练集的数量 7 | train_data=data(temp(1:num),1:n-1);%训练集自变量数据 8 | train_label=data(temp(1:num),n);%训练集标签 9 | test_data=data(temp(num+1:end),1:n-1);%测试集自变量数据 10 | test_label=data(temp(num+1:end),n);%测试集标签(真实标签) 11 | load predict_x.mat 12 | %load svm.mat 13 | %% 向量机训练 14 | %svm=fitcsvm(train_data,train_label); 15 | svm=fitcecoc(train_data,train_label);%训练支持向量机 16 | %% 模型评价 17 | test_label_predict=predict(svm,test_data);%SVM预测出来的标签 18 | disp('支持向量机SVM的预测准确率为') 19 | disp([num2str((sum(test_label_predict==test_label)/length(test_label))*100) '%']) 20 | %% 分类 21 | disp('-------------------------分界线------------------------') 22 | disp('开始分类未分类数据') 23 | disp('分类结果') 24 | disp(predict(svm,predict_x)) -------------------------------------------------------------------------------- /支持向量机/data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/支持向量机/data.mat -------------------------------------------------------------------------------- /支持向量机/predict_x.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/支持向量机/predict_x.mat -------------------------------------------------------------------------------- /支持向量机/svm.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/支持向量机/svm.mat -------------------------------------------------------------------------------- /敏感性分析/code.m: -------------------------------------------------------------------------------- 1 | %% sobol 敏感性分析 2 | %作用于模型输入对模型输出的影响程度分析(当输入参数不好估计时) 3 | clc;clear 4 | 5 | %% 初始化 6 | dimension=3;%参数数量 7 | m=dimension*2; 8 | n=40;%采样点个数 9 | low=[0 0 0];%每个参数的下限 10 | high=[1 1 1];%每个参数的上限 11 | %产生各水平参数 12 | low=[low,low]; 13 | high=[high,high]; 14 | p=sobolset(m);%sobol采样 15 | r=[]; 16 | for i=1:n %开始采样 17 | r_0=p(i,:); 18 | r_0=low+r_0.*(high-low); 19 | r=[r;r_0]; 20 | end 21 | plot(r(:,1),'b*');%画出采样图 22 | %将采样的点分成ab两份 23 | a=r(:,1:dimension);%每行一组数据,每列代表参数 24 | b=r(:,dimension+1:end); 25 | % 生成矩阵 26 | ab=zeros(n,dimension,dimension);%初始化,生成三个n*dimension矩阵,最后一个dimension可以理解为是标号 27 | for i=1:dimension%对第i个标号的矩阵,将b的第i列替换a的第i列,总共替换i次 28 | temp=a; 29 | temp(:,i)=b(:,i); 30 | ab(1:n,1:dimension,i)=temp; 31 | end 32 | %% 求解参数 33 | result_a=zeros(n,1); 34 | result_b=zeros(n,1); 35 | result_ab=zeros(n,dimension); 36 | for i=1:n 37 | result_a(i)=solvefunction(a(i,:)); 38 | result_b(i)=solvefunction(b(i,:)); 39 | for j=1:dimension 40 | result_ab(i,j)=solvefunction(ab(i,:,j)); 41 | end 42 | end 43 | %一阶影响指数公式 44 | var_x=zeros(dimension,1); 45 | s=zeros(dimension,1); 46 | result_var=var([result_a;result_b],1); 47 | for i=1:dimension 48 | for j=1:n 49 | var_x(i)=var_x(i)+result_b(j)*(result_ab(j,i)-result_a(j)); 50 | end 51 | var_x(i)=1/n*var_x(i); 52 | s(i)=var_x(i)/result_var; 53 | end 54 | 55 | %% 总效益系数的计算 56 | E=zeros(dimension,1); 57 | ST=zeros(dimension,1); 58 | for i=1:dimension 59 | for j=1:n 60 | E(i)=E(i)+(result_a(j)-result_ab(j,i))^2; 61 | end 62 | E(i)=1/(2*n)*E(i); 63 | ST(i)=E(i)/result_var; 64 | end 65 | %% 输出 66 | 67 | disp('一阶影响指数S:') 68 | disp(s) 69 | disp('全局影响指数ST:') 70 | disp(ST) 71 | -------------------------------------------------------------------------------- /敏感性分析/solvefunction.m: -------------------------------------------------------------------------------- 1 | %% 目标函数 2 | %例如这种函数,x(i)对结果的影响程度不确定,应用敏感性分析 3 | %也有可能是黑盒的程序函数,也是可以直接调用之后输入参数即可 4 | function result=solvefunction(x) 5 | result=sin(x(1))+7*(sin(x(2)))^2+0.1*x(3)^4*sin(x(1)); 6 | end -------------------------------------------------------------------------------- /敏感性分析/作用.txt: -------------------------------------------------------------------------------- 1 | 敏感性分析是投资项目的经济评价中常用的一种研究不确定性的方法。它在确定性分析的基础上,进一步分析不确定性因素对投资项目的最终经济效果指标的影响及影响程度。 2 | 3 | 4 | 类型 5 | 6 | 敏感性因素一般可选择主要参数(如销售收入、经营成本、生产能力、初始投资、寿命期、建设期、达产期等)进行分析。若某参数的小幅度变化能导致经济效果指标的较大变化,则称此参数为敏感性因素,反之则称其为非敏感性因素。 7 | 敏感性分析 8 | 9 | 10 | 敏感性分析是指从定量分析的角度研究有关因素发生某种变化对某一个或一组关键指标影响程度的一种不确定分析技术。其实质是通过逐一改变相关变量数值的方法来解释关键指标受这些因素变动影响大小的规律。 11 | 利润的敏感性分析 12 | 13 | 14 | 利润的敏感性分析是指专门研究制约利润的有关因素在特定条件下发生变化时对利润所产生影响的一种敏感性的分析方法。进行利润敏感性分析的主要目的是计算有关因素的利润灵敏度指标,揭示利润与有关因素之间的相对关系,并利用灵敏度指标进行利润预测。 15 | 16 | 步骤 17 | 18 | 1、确定敏感性分析指标 19 | 敏感性分析的对象是具体的技术方案及其反映的经济效益。因此,技术方案的某些经济效益评价指标,例如息税前利润、投资回收期、投资收益率、净现值、内部收益率等,都可以作为敏感性分析指标。 20 | 2、计算该技术方案的目标值 21 | 一般将在正常状态下的经济效益评价指标数值,作为目标值。 22 | 3、选取不确定因素 23 | 在进行敏感性分析时,并不需要对所有的不确定因素都考虑和计算,而应视方案的具体情况选取几个变化可能性较大,并对经效益目标值影响作用较大的因素。例如:产品售价变动、产量规模变动、投资额变化等;或是建设期缩短,达产期延长等,这些都会对方案的经济效益大小产生影响。 24 | 4、计算不确定因素变动时对分析指标的影响程度 25 | 若进行单因素敏感性分析时,则要在固定其它因素的条件下,变动其中一个不确定因素;然后,再变动另一个因素(仍然保持其它因素不变),以此求出某个不确定因素本身对方案效益指标目标值的影响程度。 26 | 5、找出敏感因素,进行分析和采取措施,以提高技术方案的抗风险的能力。 27 | 28 | -------------------------------------------------------------------------------- /数值计算/数值积分/code.m: -------------------------------------------------------------------------------- 1 | %% 数值积分 2 | %高斯-勒让德求积公式 3 | a=0;%积分下限 4 | b=1;%积分上限 5 | range=[a,b];%积分范围 6 | gaosi=[0 0 2; 7 | 1 sqrt(3)/3 1; 8 | 1 -sqrt(3)/3 1; 9 | 2 0 8/9; 10 | 2 sqrt(3/5) 5/9; 11 | 2 -sqrt(3/5) 5/9; 12 | 3 0.3399810 0.65214515; 13 | 3 -0.3399810 0.65214515; 14 | 3 0.86113631 0.34785486; 15 | 3 -0.86113631 0.34785486; 16 | 4 0 0.56888889; 17 | 4 0.53846931 0.47862867; 18 | 4 -0.53846931 0.47862867; 19 | 4 0.90617985 0.23692689; 20 | 4 -0.90617985 0.23692689]; 21 | %积分变化 22 | n=input('请输入高斯-勒让德求积公式阶数n:'); 23 | fun1=@(x) sin(x)/x;%被积函数 24 | fun2=@(x) sin((b+a)/2+(b-a)/2*x)/((b+a)/2+(b-a)/2*x);%变限函数 25 | m=size(gaosi); 26 | I=0;%求的积分值 27 | for i=1:m(1) 28 | flag=gaosi(i,:); 29 | if(flag(1)==n) 30 | I=I+fun2(flag(2))*flag(3); 31 | end 32 | end 33 | disp('积分的高斯-勒让德估计值为') 34 | disp(I*(b-a)/2); 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /数据包络分析/code.m: -------------------------------------------------------------------------------- 1 | %% 数据包络分析(DEA) 2 | % 多输入和多输出的综合评价 3 | clc;clear 4 | put=[89.39 86.25 108.13 106.38 62.40 47.19;64.3 99 99.6 96 96.2 79.9]';%输入指标 5 | out=[25.2 28.2 29.4 26.4 27.2 25.2;223 287 317 291 295 222]';%输出指标 6 | [put_m,put_n]=size(put'); 7 | [out_m,out_n]=size(out'); 8 | for i=1:put_n 9 | A(i,:)=[zeros(1,out_m),put(i,:)]-[out(i,:),zeros(1,put_m)]; 10 | end 11 | t=zeros(1,put_n); 12 | result=zeros(out_m,1); 13 | out=out'; 14 | for i=1:put_n 15 | b=[out(:,i);zeros(put_m,1)]; 16 | aeq=[zeros(1,out_m),put(i,:)]; 17 | dep=1; 18 | x=linprog(-b,-A,t,aeq,dep,zeros(put_m+out_m,1)); 19 | result(i,1)=b'*x; 20 | end 21 | disp('DEA效益为:') 22 | disp(result) -------------------------------------------------------------------------------- /数据包络分析/例子.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/数据包络分析/例子.png -------------------------------------------------------------------------------- /模拟退火/BOOK/code3book.m: -------------------------------------------------------------------------------- 1 | %% 模拟退火解决书店买书类问题 2 | clc;clear 3 | 4 | rng('shuffle') % 控制随机数的生成 5 | load jg.mat; 6 | load yf.mat;%载入数据(价格矩阵和运费矩阵) 7 | [x0,y0]=size(jg);%x0为书店数量,y0为需要的书本数量 8 | %% 参数初始化 9 | t0=100;%初始温度 10 | t=t0;%温度 11 | max =600;%最大迭代次数 12 | lmax=500;%每个温度对应的迭代次数 13 | a=0.95;%温度衰减系数 14 | %% 产生初始解 15 | way0 = randi([1, x0],1,y0); % 在1-x0这些整数中随机抽取一个1*y0的向量,表示这y0本书分别在哪家书店购买 16 | money0 = money(way0,yf,jg,y0); % 调用money函数计算这个方案的花费 17 | %% 方便输出结果和画图 18 | min_money = money0; % 初始化找到的最佳的解对应的花费为money0 19 | MONEY = zeros(max,1); % 记录每一次外层循环结束后找到的min_money (方便画图) 20 | 21 | %% 模拟退火过程 22 | for i = 1 : max % 外循环, 我这里采用的是指定最大迭代次数 23 | for j = 1 : lmax % 内循环,在每个温度下开始迭代 24 | way1 = newway(way0,x0,y0); % 调用newway函数生成新的方案 25 | money1 = money(way1,yf,jg,y0); % 计算新方案的花费 26 | if money1 < money0 % 如果新方案的花费小于当前方案的花费 27 | way0 = way1; % 更新当前方案为新方案 28 | money0 = money1; 29 | else 30 | p = exp(-(money1 - money0)/t); % 根据Metropolis准则计算一个概率 31 | if rand(1) < p % 生成一个随机数和这个概率比较,如果该随机数小于这个概率 32 | way0 = way1; 33 | money0 = money1; 34 | end 35 | end 36 | % 判断是否要更新找到的最佳的解 37 | if money0 < min_money % 如果当前解更好,则对其进行更新 38 | min_money = money0; % 更新最小的花费 39 | bestway = way0; % 更新找到的最佳方案 40 | end 41 | end 42 | MONEY(i) = min_money; % 保存本轮外循环结束后找到的最小花费 43 | t = a*t; % 温度下降 44 | end 45 | 46 | disp('最佳的方案是:');disp(mat2str(bestway)) 47 | disp('此时最优值是:'); disp(min_money) 48 | %% 画出每次迭代后找到的最佳方案的图形 49 | figure 50 | plot(1:max,MONEY,'b-'); 51 | xlabel('迭代次数'); 52 | ylabel('最小花费'); -------------------------------------------------------------------------------- /模拟退火/BOOK/jg.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/模拟退火/BOOK/jg.mat -------------------------------------------------------------------------------- /模拟退火/BOOK/money.m: -------------------------------------------------------------------------------- 1 | function out = money(in1,in2,in3,in4) 2 | % 输入:in1: 购买方案; in2:运费; in3: 每本书在每家店的价格; in4:一共要购买几本书 3 | index = unique(in1); % 在哪些商店购买了商品,因为我们等下要计算运费unique(A)找到不重复的A中元素 4 | out = sum(in2(index)); % 计算买书花费的运费 5 | % 计算总花费:刚刚计算出来的运费 + 五本书的售价 6 | for i = 1:in4 7 | out = out + in3(in1(i),i); 8 | end 9 | end -------------------------------------------------------------------------------- /模拟退火/BOOK/newway.m: -------------------------------------------------------------------------------- 1 | function out = newway(in1, in2, in3) 2 | % in1:原来的买书方案,是一个1*in3的向量,每一个元素都位于1-in2之间 3 | index = randi([1, in3],1) ; % 看哪一本书要更换书店购买 4 | out= in1; % 将原来的方案赋值给out 5 | out(index) = randi([1, in2],1); % 将in1中的第index本书换一个书店购买 6 | end 7 | -------------------------------------------------------------------------------- /模拟退火/BOOK/yf.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/模拟退火/BOOK/yf.mat -------------------------------------------------------------------------------- /模拟退火/FUNCTION/code1function.m: -------------------------------------------------------------------------------- 1 | %% 模拟退火算法1.函数极值问题 2 | clear;clc 3 | 4 | %%参数初始化 5 | n=2 ;%变量个数 6 | t0=100 ;%初始温度 7 | t=t0;%退火过程温度 8 | max=600 ;%退出算法的最大迭代次数 9 | lmax=500 ;%对每次的温度t下的迭代次数 10 | a=0.95 ;%温度衰减系数 11 | xm=[9,9] ;%x定义域的上界 12 | xi= [1,3];%x定义域的下界 13 | 14 | %%随机生成初始解 15 | x0 = zeros(1:n); 16 | for i=1:n 17 | x0(i)=xi(i)+(xm(i)-xi(i))*rand(1); 18 | end 19 | y0=fun(x0); %fun为自定的函数(目标函数) 20 | 21 | %% 定义一些保存中间过程的量,方便输出结果和画图 22 | ym=y0; 23 | maxy=zeros(max,n); 24 | %%模拟退火过程 25 | for wai=1:max%这里采用的是最大迭代次数退出模拟退火算法,外循环 26 | for nei=1:lmax%每个温度t迭代lmax遍,内循环 27 | y=randn(1,n);%生成对应函数变量的N(0,1)随机数 28 | z=y/sqrt(sum(y.^2));%产生新解,按照原有函数规则。这里必须根据具体的规则来拟定*** 29 | xnew=x0+z*t;%根据具体的规则来确定新的解*** 30 | %对这个新解进行调整保证它在定义域范围内 31 | for j=1:n 32 | if xnew(j)xm(j) 36 | r= rand(1); 37 | xnew(j)=r*xi(j)+(1-r)*x0(j); 38 | end 39 | end 40 | x1= xnew;%将新解赋值给x1 41 | y1=fun(xnew);%得到新解的目标函数值 42 | if y1>y0%这里是求目标函数在定义域内的最大值** 43 | x0=x1;%将原解替换为新解 44 | y0=y1; 45 | else 46 | p=exp(-(y0-y1)/t);%根据Metropolis准则生成一个概率 47 | if rand(1)maxy 54 | besty=y0; 55 | bestx=x0; 56 | end 57 | end 58 | maxy(i,:)=besty;%保存每次循环结束后最好的值 59 | t=a*t;%温度下降 60 | end 61 | disp('最佳的位置:');disp(bestx) 62 | disp('此时最优值是:'); disp(besty) 63 | %%画图的话后续再添加,如果是多元函数最好不画图了 -------------------------------------------------------------------------------- /模拟退火/FUNCTION/fun.m: -------------------------------------------------------------------------------- 1 | function out=fun(in) 2 | out=in(1)^2+in(2)+5+3*in(1)+2*in(2); 3 | end -------------------------------------------------------------------------------- /模拟退火/TSP/code2TSP.m: -------------------------------------------------------------------------------- 1 | %% 模拟退火算法2.TSP旅行商问题 2 | rng('shuffle') % 控制随机数的生成,否则每次打开matlab得到的结果都一样 3 | clear;clc 4 | rng('shuffle') % 控制随机数的生成,否则每次打开matlab得到的结果都一样 5 | locatuion= ;%位置坐标,用于后续画散点图 6 | n = size(location,1);%城市数目 7 | figure % 新建一个图形窗口 8 | plot(location(:,1),location(:,2),'o'); % 画出城市的分布散点图 9 | hold on 10 | distance = zeros(n); % 初始化两个城市的距离矩阵全为0 11 | for i = 2:n 12 | for j = 1:i 13 | location_i = location(i,:); x_i =locaition_i(1); y_i = location_i(2); % 城市i的横坐标为x_i,纵坐标为y_i 14 | location_j = location(j,:); x_j = location_j(1); y_j = location_j(2); % 城市j的横坐标为x_j,纵坐标为y_j 15 | distance(i,j) = sqrt((x_i-x_j)^2 + (y_i-y_j)^2); % 计算城市i和j的距离 16 | end 17 | end 18 | d = distance+distance'; % 生成距离矩阵的对称的一面 19 | %%参数初始化 20 | t0= ;%初始温度 21 | t=t0;%退火过程温度 22 | max= ;%退出算法的最大迭代次数 23 | lmax= ;%对每次的温度t下的迭代次数 24 | a= ;%温度衰减系数 25 | 26 | %% 随机生成一个初始解 27 | path0 = randperm(n); % 生成一个1-n的随机打乱的序列作为初始的路径 28 | result0 = path(path0,d); % 调用path函数计算当前路径的距离 29 | 30 | %% 定义一些保存中间过程的量,方便输出结果和画图 31 | minresult = result0; % 初始化找到的最佳的解对应的距离为result0 32 | MINresult = zeros(max,1); % 记录每一次外层循环结束后找到的minresult (方便画图) 33 | %%模拟退火过程 34 | for wai=1:max%这里采用的是最大迭代次数退出模拟退火算法,外循环 35 | for nei=1:lmax%每个温度t迭代lmax遍,内循环 36 | path1 = newpath(path0); % 调用newpath函数生成新的路径 37 | result1 = path(path1,d); % 计算新路径的距离 38 | %如果新解距离短,则直接把新解的值赋值给原来的解 39 | if result1 < result0 40 | path0 = path1; % 更新当前路径为新路径 41 | result0 = result1; 42 | else 43 | p = exp(-(result1 - result0)/t); % 根据Metropolis准则计算一个概率 44 | if rand(1) < p % 生成一个随机数和这个概率比较,如果该随机数小于这个概率 45 | path0 = path1; % 更新当前路径为新路径 46 | result0 = result1; 47 | end 48 | end 49 | % 判断是否要更新找到的最佳的解 50 | if result0 < minresult % 如果当前解更好,则对其进行更新 51 | minresult = result0; % 更新最小的距离 52 | bestpath = path0; % 更新找到的最短路径 53 | end 54 | end 55 | MINresult(i) = minresult; % 保存本轮外循环结束后找到的最小距离 56 | t= a*t; % 温度下降 57 | end 58 | 59 | disp('最佳的方案是:'); disp(mat2str(bestpath)) 60 | disp('此时最优值是:'); disp(minresult) 61 | bestpath = [bestpath,bestpath(1)]; % 在最短路径的最后面加上一个元素,即第一个点(我们要生成一个封闭的图形) 62 | n = n+1; % 城市的个数加一个(紧随着上一步) 63 | for i = 1:n-1 64 | j = i+1; 65 | location_i = location(bestpath(i),:); x_i = location_i(1); y_i = location_i(2); 66 | location_j = location(bestpath(j),:); x_j = location_j(1); y_j = location_j(2); 67 | plot([x_i,x_j],[y_i,y_j],'-b') % 每两个点就作出一条线段,直到所有的城市都走完 68 | % pause(0.02) % 暂停0.02s再画下一条线段 69 | hold on 70 | end 71 | 72 | %% 画出每次迭代后找到的最短路径的图形 73 | figure 74 | plot(1:max,Minresult,'b-'); 75 | xlabel('迭代次数'); 76 | ylabel('最短路径'); 77 | -------------------------------------------------------------------------------- /模拟退火/TSP/newpath.m: -------------------------------------------------------------------------------- 1 | function out = newpath(in) 2 | % in: 原来的路径 3 | n = length(in); 4 | % 随机选择两种产生新路径的方法 5 | p1 = 0.33; % 使用交换法产生新路径的概率 6 | p2 = 0.33; % 使用移位法产生新路径的概率 7 | r = rand(1); % 随机生成一个[0 1]间均匀分布的随机数 8 | if r< p1 % 使用交换法产生新路径 9 | c1 = randi(n); % 生成1-n中的一个随机整数 10 | c2 = randi(n); % 生成1-n中的一个随机整数 11 | out = in; % 将path0的值赋给path1 12 | out(c1) = in(c2); %改变path1第c1个位置的元素为path0第c2个位置的元素 13 | out(c2) = in(c1); %改变path1第c2个位置的元素为path0第c1个位置的元素 14 | elseif r < p1+p2 % 使用移位法产生新路径 15 | c1 = randi(n); % 生成1-n中的一个随机整数 16 | c2 = randi(n); % 生成1-n中的一个随机整数 17 | c3 = randi(n); % 生成1-n中的一个随机整数 18 | sort_c = sort([c1 c2 c3]); % 对c1 c2 c3从小到大排序 19 | c1 = sort_c(1); c2 = sort_c(2); c3 = sort_c(3); % c1 < = c2 <= c3 20 | tem1 = in(1:c1-1); 21 | tem2 = in(c1:c2); 22 | tem3 = in(c2+1:c3); 23 | tem4 = in(c3+1:end); 24 | out = [tem1 tem3 tem2 tem4]; 25 | else % 使用倒置法产生新路径 26 | c1 = randi(n); % 生成1-n中的一个随机整数 27 | c2 = randi(n); % 生成1-n中的一个随机整数 28 | if c1>c2 % 如果c1比c2大,就交换c1和c2的值 29 | tem = c2; 30 | c2 = c1; 31 | c1 = tem; 32 | end 33 | tem1 = in(1:c1-1); 34 | tem2 = in(c1:c2); 35 | tem3 = in(c2+1:end); 36 | out = [tem1 fliplr(tem2) tem3]; %矩阵的左右对称翻转 fliplr,上下对称翻转 flipud 37 | end 38 | end -------------------------------------------------------------------------------- /模拟退火/TSP/path.m: -------------------------------------------------------------------------------- 1 | function out = path(in1,in2) 2 | % 输入:in1:路径(1至n的一个序列),in2:距离矩阵 3 | n = length(in1); 4 | out = 0; % 初始化该路径走的距离为0 5 | for i = 1:n-1 6 | out = in2(in1(i),in1(i+1)) + out; % 按照这个序列不断的更新走过的路程这个值 7 | end 8 | out = in2(in1(1),in1(n)) + out; % 别忘了加上从最后一个城市返回到最开始那个城市的距离 9 | end -------------------------------------------------------------------------------- /灰色关联性分析/code.m: -------------------------------------------------------------------------------- 1 | %% 灰色关联分析 2 | %题设分析结构变量(前三列)和产品性能(4-6)对插层率(7)的影响 3 | clc;clear 4 | load data.mat 5 | [m,n]=size(data); 6 | % 预处理去除量纲影响 7 | ave=repmat(mean(data),m,1); 8 | data=data./ave; 9 | % 子序列和母序列的定义(子序列为分析自变量,母序列为分析因变量) 10 | x1=data(:,1:3); 11 | x2=data(:,4:6); 12 | y=data(:,end); 13 | y_rep=repmat(y,1,3);%将因变量的列数复制成跟自变量一样 14 | absx1=abs(x1-y_rep); 15 | absx2=abs(x2-y_rep); 16 | %全局最小 17 | min1=min(min(absx1)); 18 | min2=min(min(absx2)); 19 | %全局最大 20 | max1=max(max(absx1)); 21 | max2=max(max(absx2)); 22 | ro = 0.5; %分辨系数取0.5 23 | gamma1 =(min1+ro*max1)./(absx1+ro*max1); %计算子序列1结构变量中各个指标与母序列的关联系数 24 | gamma2 =(min2+ro*max2)./(absx2+ro*max2); %计算子序列2产品性能中各个指标与母序列的关联系数 25 | %输出 26 | disp('结构变量对插层率的各个指标灰色关联度为') 27 | disp(mean(gamma1)) 28 | disp('产品性能对插层率的各个指标灰色关联度为') 29 | disp(mean(gamma2)) -------------------------------------------------------------------------------- /灰色关联性分析/data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/灰色关联性分析/data.mat -------------------------------------------------------------------------------- /理论/参考文献.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/参考文献.pdf -------------------------------------------------------------------------------- /理论/第01章 线性规划.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第01章 线性规划.pdf -------------------------------------------------------------------------------- /理论/第02章 整数规划.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第02章 整数规划.pdf -------------------------------------------------------------------------------- /理论/第03章 非线性规划.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第03章 非线性规划.pdf -------------------------------------------------------------------------------- /理论/第04章 动态规划.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第04章 动态规划.pdf -------------------------------------------------------------------------------- /理论/第05章 图与网络.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第05章 图与网络.pdf -------------------------------------------------------------------------------- /理论/第06章 排队论.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第06章 排队论.pdf -------------------------------------------------------------------------------- /理论/第07章 对策论.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第07章 对策论.pdf -------------------------------------------------------------------------------- /理论/第08章 层次分析法.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第08章 层次分析法.pdf -------------------------------------------------------------------------------- /理论/第09章 插值与拟合.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第09章 插值与拟合.pdf -------------------------------------------------------------------------------- /理论/第10章 数据的统计描述和分析.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第10章 数据的统计描述和分析.pdf -------------------------------------------------------------------------------- /理论/第11章 方差分析.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第11章 方差分析.pdf -------------------------------------------------------------------------------- /理论/第12章 回归分析.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第12章 回归分析.pdf -------------------------------------------------------------------------------- /理论/第13章 微分方程建模.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第13章 微分方程建模.pdf -------------------------------------------------------------------------------- /理论/第14章 稳定状态模型.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第14章 稳定状态模型.pdf -------------------------------------------------------------------------------- /理论/第15章 常微分方程的解法.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第15章 常微分方程的解法.pdf -------------------------------------------------------------------------------- /理论/第16章 差分方程模型.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第16章 差分方程模型.pdf -------------------------------------------------------------------------------- /理论/第17章 马氏链模型.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第17章 马氏链模型.pdf -------------------------------------------------------------------------------- /理论/第18章 变分法模型.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第18章 变分法模型.pdf -------------------------------------------------------------------------------- /理论/第19章 神经网络模型.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第19章 神经网络模型.pdf -------------------------------------------------------------------------------- /理论/第20章 偏微分方程的数值解.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第20章 偏微分方程的数值解.pdf -------------------------------------------------------------------------------- /理论/第21章 目标规划.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第21章 目标规划.pdf -------------------------------------------------------------------------------- /理论/第22章 模糊数学模型.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第22章 模糊数学模型.pdf -------------------------------------------------------------------------------- /理论/第23章 现代优化算法.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第23章 现代优化算法.pdf -------------------------------------------------------------------------------- /理论/第24章 时间序列模型.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第24章 时间序列模型.pdf -------------------------------------------------------------------------------- /理论/第25章 存贮论.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第25章 存贮论.pdf -------------------------------------------------------------------------------- /理论/第26章 经济与金融中的优化问题.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第26章 经济与金融中的优化问题.pdf -------------------------------------------------------------------------------- /理论/第27章 生产与服务运作管理中的优化问题.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第27章 生产与服务运作管理中的优化问题.pdf -------------------------------------------------------------------------------- /理论/第28章 灰色系统理论及其应用.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第28章 灰色系统理论及其应用.pdf -------------------------------------------------------------------------------- /理论/第29章 多元分析.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第29章 多元分析.pdf -------------------------------------------------------------------------------- /理论/第30章 偏最小二乘回归.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/第30章 偏最小二乘回归.pdf -------------------------------------------------------------------------------- /理论/附录一 Matlab入门.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/附录一 Matlab入门.pdf -------------------------------------------------------------------------------- /理论/附录三 运筹学的LINGO软件.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/附录三 运筹学的LINGO软件.pdf -------------------------------------------------------------------------------- /理论/附录二 Matlab在线性代数中的应用.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/附录二 Matlab在线性代数中的应用.pdf -------------------------------------------------------------------------------- /理论/附录四 判别分析.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/理论/附录四 判别分析.pdf -------------------------------------------------------------------------------- /空闲时间code/code.m: -------------------------------------------------------------------------------- 1 | load lpc.mat; 2 | load sxy.mat; 3 | load tsy.mat; 4 | a=lpc+sxy+tsy; 5 | a==0 -------------------------------------------------------------------------------- /空闲时间code/lpc.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/空闲时间code/lpc.mat -------------------------------------------------------------------------------- /空闲时间code/sxy.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/空闲时间code/sxy.mat -------------------------------------------------------------------------------- /空闲时间code/tsy.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/空闲时间code/tsy.mat -------------------------------------------------------------------------------- /算法模型.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/算法模型.pdf -------------------------------------------------------------------------------- /粒子群/PSO.m: -------------------------------------------------------------------------------- 1 | %% 粒子群PSO算法 2 | clc;clear 3 | %% 初始化参数 4 | n=50;%初始的种群个数 5 | d=1;%变量个数 6 | lim=[];%参数的限制 7 | vlim=[];%“飞行”速度的限制 8 | %这些限制参数第一行为上界第二行为下界 9 | w=0.8;%惯性权重 10 | c1=0.5;%自我学习因子 11 | c2=0.5;%社会学习因子 12 | max=20;%最大迭代次数 13 | %figure(1); ezplot(fun(),[ min,0.01 ,max]);%画图需要自己输入fun目标函数,min参数下界,max参数上界,变量多于2就不画图 14 | x0=lim()+(lim()-lim())*rand(n,d);%初始化种群位置 15 | v0=rand(n,d);%初始化种群速度 16 | xmax=x0;%xmax记录个体最佳位置,当前为初始化 17 | ymax=zeros(1,d);%ymax记录种群的最佳位置既优化问题的解 18 | fxm=ones(n,1)*inf;%记录每个个体的最大适应度 19 | fym=inf;%记录种群的最大适应度 20 | % hold on 21 | % plot(xmax,fun(xmax),'ro');title("初始状态图"); 22 | % figure(2) %这里也是如果变量比2大就不画图 23 | 24 | %% PSO过程 25 | for iter = 1:max 26 | fx=fun(x0); 27 | for i=1:n 28 | if fx(i)vlim(1,:))= vlim(1,:); 40 | v0(v0xlim(1,:))=xlim(1,:); 44 | x0(x0=0} 10 | 11 | c=[-0.4 -0.28 -2.32 -0.72 -0.64 -0.6]; 12 | A=[0.01 0.01 0.01 0.03 0.03 0.03;0.02 0 0 0.05 0 0;0 0.02 0 0 0.05 0;0 0 0.03 0 0 0.08];%不等式系数 13 | b=[850 700 100 900];%不等式值 14 | Aeq=[];%等式约束系数 15 | beq=[];%等式约束值 16 | vlb=[0 0 0 0 0 0];%变量下限 17 | vub=[];%变量上限 18 | [x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub); 19 | -------------------------------------------------------------------------------- /规划/非线性规划/code.m: -------------------------------------------------------------------------------- 1 | %% 非线性规划 2 | -------------------------------------------------------------------------------- /遗传算法/code.m: -------------------------------------------------------------------------------- 1 | %% 遗传算法 GA 采用浮点数编码 2 | clc;clear 3 | best1=-inf; 4 | for t=1:100 %SB算法得到较好的最优解 5 | %% 初始化参数 6 | n=200;%种群数目 7 | ger=1000;%迭代次数,总共有多少代 8 | var=0.2;%变异概率 9 | acr=0.4;%交叉概率 10 | 11 | n_chr=2;%染色体个数,自变量个数 12 | length_chr=10;%精度,二进制编码长度,染色体内基因个数 (这里不需要) 13 | range_chr=[-10 10;-10 10];%自变量的取值范围*** 14 | 15 | best_fitness=zeros(1,ger);%存放每一代的最优适应度 16 | ave_fitness=zeros(1,ger);%存放每一代的平均适应度 17 | 18 | %% 初始化第一代solvevar(chr,var,n,n_chr,range_chr,i,ger) 19 | chr=rand(n,n_chr);%存放个体的染色体 20 | for i=1:n_chr 21 | chr(:,i)=chr(:,i)*(range_chr(i,2)-range_chr(i,1))+range_chr(i,1);%映射到范围*** 22 | end 23 | fitness=solvefit(chr,n,n_chr);%计算适应度 24 | best_fitness(1)=max(fitness); %将当前最优存入矩阵当中 25 | ave_fitness(1)=mean(fitness);%将当前平均适应度存入矩阵当中 26 | best_chr=findbest_chr(chr,fitness,n_chr);%存放最优染色体和适应度前n_chr个是染色体,n_chr+1是适应度 27 | %% 开始遗传 28 | for i=2:ger 29 | chr=solveacr(chr,acr,n,n_chr);%交叉过程 30 | chr=solvevar(chr,var,n,n_chr,range_chr,i,ger);%变异处理 31 | fitness=solvefit(chr,n,n_chr);%计算适应度 32 | best=findbest_chr(chr,fitness,n_chr); 33 | if best_chr(end)range(2) 4 | if abs(in-range(1))best.fitness 36 | best.fitness=new_fitness; 37 | best.bin=bin(newfitness_id,:); 38 | best.chr=chr(2*newfitness_id-1:2*newfitness_id,:); 39 | best.dec=dec(newfitness_id,:); 40 | end 41 | ger_fitness(i)=best.fitness; 42 | end 43 | disp('遗传结束') 44 | %% 画进化曲线 45 | figure(1) 46 | plot(1:ger,ger_fitness,'b-','LineWidth',1.5) 47 | title('量子遗传优化算法'); 48 | xlabel('进化代数'); 49 | ylabel('每代的最佳适应度'); 50 | 51 | %% 显示优化结果 52 | disp(['最优解:',num2str(best.dec)]) 53 | disp(['最佳适应度:',num2str(best.fitness)]); 54 | figure(2) 55 | x=-3:0.1:12.1; 56 | y=4.1:0.1:5.8; 57 | [x,y]=meshgrid(x,y); 58 | z=x.*sin(4*pi*x)+y.*sin(20*pi*y); 59 | surf(x,y,z) -------------------------------------------------------------------------------- /量子优化遗传算法/coll.m: -------------------------------------------------------------------------------- 1 | %得到二进制编码函数 2 | function bin=coll(chr) 3 | [m,n]=size(chr); 4 | m=m/2;%得到种群大小 5 | bin=zeros(m,n);%二进制编码初始化 6 | for i=1:m 7 | for j=1:n 8 | r=rand; 9 | if r>(chr(2.*i-1,j)^2) %随机数大于α平方(自旋向上) 10 | bin(i,j)=1; 11 | else 12 | bin(i,j)=0; 13 | end 14 | end 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /量子优化遗传算法/gate.m: -------------------------------------------------------------------------------- 1 | %% 量子旋转门调整策略 2 | % 输入 chr:更新前的量子比特编码 3 | % fitness:适应度值 4 | % best:当前种群中最优个体 5 | % bin:二进制编码 6 | % 输出 chr:更新后的量子比特编码 7 | function chr=gate(chr,fitness,best,bin) 8 | size_pop=size(chr,1)/2; 9 | len_chr=size(bin,2); 10 | for i=1:size_pop 11 | for j=1:len_chr 12 | alpha=chr(2*i-1,j); % α自旋向上 13 | beta=chr(2*i,j); % β自旋向上 14 | x=bin(i,j); 15 | b=best.bin(j); 16 | if ((x==0)&&(b==0))||((x==1)&&(b==1)) 17 | delta=0; % delta为旋转角的大小 18 | s=0; % s为旋转角的符号,即旋转方向 19 | elseif (x==0)&&(b==1)&&(fitness(i)0 22 | s=1; 23 | elseif alpha*beta<0 24 | s=-1; 25 | elseif alpha==0 26 | s=0; 27 | elseif beta==0 28 | s=sign(randn); 29 | end 30 | elseif (x==0)&&(b==1)&&(fitness(i)>=best.fitness) 31 | delta=0.01*pi; 32 | if alpha*beta>0 33 | s=-1; 34 | elseif alpha*beta<0 35 | s=1; 36 | elseif alpha==0 37 | s=sign(randn); 38 | elseif beta==0 39 | s=0; 40 | end 41 | elseif (x==1)&&(b==0)&&(fitness(i)0 44 | s=-1; 45 | elseif alpha*beta<0 46 | s=1; 47 | elseif alpha==0 48 | s=sign(randn); 49 | elseif beta==0 50 | s=0; 51 | end 52 | elseif (x==1)&&(b==0)&&(fitness(i)>=best.fitness) 53 | delta=0.01*pi; 54 | if alpha*beta>0 55 | s=1; 56 | elseif alpha*beta<0 57 | s=-1; 58 | elseif alpha==0 59 | s=0; 60 | elseif beta==0 61 | s=sign(randn); 62 | end 63 | end 64 | e=s*delta; % e为旋转角 65 | U=[cos(e) -sin(e);sin(e) cos(e)]; % 量子旋转门 66 | y=U*[alpha beta]'; % y为更新后的量子位 67 | chr(2*i-1,j)=y(1); 68 | chr(2*i,j)=y(2); 69 | end 70 | end -------------------------------------------------------------------------------- /量子优化遗传算法/solvefitness.m: -------------------------------------------------------------------------------- 1 | %% 适应度函数 2 | % 输入 bin:二进制编码 3 | % range_len:各变量的二进制位数 4 | % 输出 fitness:适应度 5 | % dec:十进制数(待优化参数) 6 | function [fitness,dec]=solvefitness(bin,range_len) 7 | sizepop=size(bin,1); 8 | fitness=zeros(1,sizepop); 9 | num=size(range_len,2); 10 | dec=zeros(sizepop,num); 11 | for i=1:sizepop 12 | [fitness(i),dec(i,:)]=solvefunction(bin(i,:),range_len); %solvefunction题目所设目标函数 13 | end 14 | -------------------------------------------------------------------------------- /量子优化遗传算法/solvefunction.m: -------------------------------------------------------------------------------- 1 | function [fitness,dec]=solvefunction(bin,range_len) 2 | %% 目标函数 3 | % 输入 bin:二进制编码 4 | % range_len:各变量的二进制位数 5 | % 输出 fitness:目标值 6 | % dec:十进制数 7 | global range; 8 | %% 二进制转十进制 9 | dec=bin2decfunction(bin,range_len,range); 10 | %% 计算适应度-函数值 11 | fitness=sin(4*pi*dec(1))*dec(1)+sin(20*pi*dec(2))*dec(2); 12 | -------------------------------------------------------------------------------- /马尔科夫预测/code.m: -------------------------------------------------------------------------------- 1 | %% 马尔可夫预测 2 | clc;clear 3 | load data.mat; 4 | n=3;%状态类型个数 5 | x=data(:,1); 6 | y=data(:,2); 7 | num=length(y);%得到状态总个数 8 | 9 | %状态转移概率矩阵 10 | for i=1:n 11 | for j=1:n 12 | p((i-1)*n+j)=0; 13 | end 14 | end 15 | %记录状态转移的数量矩阵 16 | for i=1:num-1 17 | judge=y(i+1)-y(i); 18 | p((y(i)-1)*n+y(i)+judge)=p((y(i)-1)*n+y(i)+judge)+1; 19 | end 20 | n1=zeros(n,1);%初始化起始状态量 21 | %记录总起始状态量 22 | for i=1:num-1 23 | for j=1:n 24 | if y(i)==j 25 | n1(j)=n1(j)+1; 26 | end 27 | end 28 | end 29 | %分割状态转移的数量矩阵 30 | k=0; 31 | newp=zeros(n,n); 32 | for i=1:n 33 | for j=1:n 34 | newp(i,j)=p((i-1)*n+j); 35 | end 36 | end 37 | %输出状态转移概率矩阵 38 | P=newp./n1 39 | 40 | %% 马尔可夫预测法 41 | predict=input('输入需要预测的期数'); 42 | pi=zeros(predict+1,n);%初始化状态概率 43 | %得到起始状态概率 44 | for i=1:n 45 | if y(end)==i 46 | pi(1,i)=1 47 | end 48 | end 49 | %生成后续每期的状态概率 50 | for i=2:predict+1 51 | pi(i,:)=pi(i-1,:)*P; 52 | end 53 | disp('每期的概率矩阵') 54 | pi 55 | %% 终极概率预测 56 | result = null(eye(n)-P'); 57 | result = result/sum(result) -------------------------------------------------------------------------------- /马尔科夫预测/data.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tongshiyan/TsyMatlab/e1e40f84261baf3bd6aa8c814ff14e2dfad5a331/马尔科夫预测/data.mat --------------------------------------------------------------------------------