春节过完了哈,现在有时间整理总结一下美赛的经验了,温故知新哈哈。
我们选的是E题,找数据要找麻了,其中最重要用到的爬虫技术在上一篇中已经讲过了,这里主要总结一下MATLAB里的代码。
(一)TOPSIS+层次分析+熵权法
这次在比赛过程中学到了一个很重要的观念,不要把一些方法的地位看的太重要,比如层次分析法,比如聚类分析等,这些只能叫做一种方法,不是整个模型,你可以拿一个这样的方法只用来解决一个很小很小的问题,只要是适用的。真正能解决问题的模型是由很多很多方法组合起来加上对实际情况的考虑共同建立起来的。
这几个代码也没什么可说的,很常用又固定的方法,只需要套入数据就好,代码在网上也很好找
对于评价类模型,很重要的一点就是确定权重。第一反映的确定权重的两个方法就是层次分析和熵权法,但是层次分析太主观了,熵权法又太客观了。所以我们通过查资料发现可以两个同时用,然后将两个权重结合起来,用乘数归一法:
%AHP-熵权法确定综合权重 乘数归一法
%熵权法权重
V = [0.2,0.2,0.1,0.2,0.1,0.2];
%AHP权重
P = [ 0.2,0.1,0.1,0.2,0.1,0.3];
sumVP = sum(V.*P);
a = (V.*P)/sumVP;
disp('综合权重:')
disp(a)
(二)MATLAB求解方程
MATLAB提供了一个符号计算工具箱(Symbolic Math Toolbox),它允许用户进行符号计算,包括公式的推导、化简、求导、积分等操作。
求导、积分演示示例:
syms x
% 定义一个符号函数
f = x^2 + 3*x + 2;
% 对函数进行求导
df = diff(f, x);
disp(df);
% 对函数进行积分(注意:这里积分会得到一个原函数,需要指定积分常数C)
integral_f = int(f, x);
disp(integral_f);
定义公式函数:
clc;clear;close all
% 定义符号变量
syms x y z
%%
% 定义一个符号函数,一元函数
f = x^2 + 3*x + 2;
%用subs函数替换x值,求解对应函数值
val = subs(f,x,1);
disp('函数值1为:')
disp(val)
%%
% 定义一个匿名函数
%与上一种方法的差别在于,声明x为f的自变量
%不用subs函数替换求解了,可以直接通过f(2)得到函数值
f = @(x) x^2 + 3*x + 2;
disp('函数值2为:')
val = f(2);
disp(val)
%%
% 定义一个等式
eqn = x^2 + 3*y + 2 == 0;
%用solve函数将等式转变为指定函数式
f = solve(eqn,y);
%用subs函数替换x值,求解对应函数值
val = subs(f,x,1);
disp('函数值3为:')
disp(val)
subs函数解释:
在MATLAB中,
subs
函数是用于符号表达式替换的函数。它允许你将符号表达式中的某个或某些符号替换为具体的数值或其他的表达式。这是符号计算中常用的一个函数,特别是当你想要评估一个符号表达式在特定点上的值时。
subs
函数的基本语法是:
matlab复制代码
subs(s, old, new)
其中:
s
是一个符号表达式。old
是要被替换的符号或子表达式。new
是用来替换old
的数值或表达式。如果
old
和new
都是符号变量或表达式,那么subs
将在s
中用new
替换old
。如果old
是一个符号变量,而new
是一个数值,那么subs
将计算表达式s
在该符号变量取该数值时的结果。举个例子,如果你有一个符号表达式
f
定义为f = x^2 + y
,你想要计算在x = 2
和y = 3
时的值,你可以这样做:
matlab复制代码
syms x y;
f = x^2 + y;
value = subs(f, {x, y}, {2, 3});
在这个例子中,
value
将会得到结果7
,因为2^2 + 3 = 7
。你也可以分步骤替换变量:
matlab复制代码
syms x y;
f = x^2 + y;
f_x2 = subs(f, x, 2); % 替换x为2
f_value = subs(f_x2, y, 3); % 在上一步的基础上替换y为3
这样,
f_value
同样会得到结果7
。请注意,
subs
函数返回的是一个替换后的新表达式或数值,它不会改变原来的符号表达式。
solve函数解释:
solve
函数是MATLAB中的一个符号计算函数,用于求解方程或方程组的符号解。以下是solve
函数的基本用法:
- 定义符号变量:使用
syms
函数定义符号变量,例如:syms x y z
。- 定义方程或方程组:将方程或方程组表示为符号表达式,例如:
eq1 = x^2 + y^2 == 1
。- 调用
solve
函数:使用solve
函数求解方程或方程组的符号解,例如:sol = solve(eq1, [x, y])
。其中,第一个参数是方程或方程组,第二个参数是未知数的符号变量。solve
函数返回的是一个结构体数组,每个元素对应一个符号解。另外,
solve
函数也可以用于求解单个方程,例如:sol = solve(eq1, x)
,其中eq1
是一个关于x
的方程。此时,solve
函数将返回x
的符号解。需要注意的是,在使用
solve
函数时,需要先定义变量为符号变量,可以使用syms
函数来定义符号变量。此外,如果方程或方程组有多个解,solve
函数将返回所有可能的解。
(三)MATLAB画图命令
总结:
clc;clear;close all
%准备数据
y = sort(randi(10,1,9),"descend");
x = 1:9;
plot(x,y,'LineWidth',2); %画线
hold on %继续在这个图上画
plot(x,y,'o','LineWidth',2) %画点
grid on %画网格
set(gca, 'LineWidth', 2) %设定网格线格式(具体设置细节MATLAB自带文档很详细)
set(gca,'XGrid','off') %关闭与x轴垂直的网格
xlabel('x') %横坐标标签
ylabel('y') %纵坐标标签
axis([1 9 1 10]) %设置横纵坐标量程
legend('SSE','Location','southwest')%设置图例
%取消上侧和右侧边框
box off % 取消边框
ax1 = axes('Position',get(gca,'Position'),'XAxisLocation','top',...
'YAxisLocation','right','Color','none','XColor','k','YColor','k'); % 设置坐标区
set(ax1,'XTick', [],'YTick', []); % 去掉xy轴刻度
OK就这些了,关于这些总结以后还可以回来参考。假期里太懒了,有各种玩的计划,这边就拖延了 (=。=)
昨天看了热辣滚烫,很喜欢两个苹果的问题:
如果你有两个苹果,一个大的一个小的,朋友跟你要,你给哪个?