数学建模学习8
作者:互联网
o奖论文——F
P1——10页
1、找数据
我们选择了2009年至2018年期间来自50个国家的14个指标的原始数据。然后通过柯尔莫戈罗夫-Smirnov检验验证了数据的分布规律,并选择80%的分位数作为接受范围(健康范围)
2、我们使用分析层次过程来确定每个指标的权重。该结果可以用来衡量特定国家的健康状况。我们还建立了使用dea-马尔姆奎斯特模型来检验可持续性的方法。•
3、代入国家
然后,我们将我们的模型应用到五个选定的国家
4、,我们选择了具有较大上行潜力的印度,作为我们研究的案例。在评估了其地位后,我们建立了我们的愿景,并制定了有针对性的政策。然后,我们使用马尔可夫链来预测我们的政治的影响,并绘制出预测的时间线。
用到的代码实现
1、绘制地图代码(世界、中国)
2、层次分析法代码实现
3、双层饼状图的绘制
注1、3为代码转载
#世界地图
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker
from pyecharts.globals import ThemeType#主题
'''map = (
Map()
.add("", [list(z) for z in zip(Faker.country, Faker.values())], "world")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="Map-世界地图",pos_right='center'),
visualmap_opts=opts.VisualMapOpts(max_=200),)
)'''
#单独调用
map = Map(init_opts=opts.InitOpts(bg_color="#AAFFEE", theme=ThemeType.ROMANTIC))
country = ["China", "Canada", "Brazil", "Russia", "United States", "Africa", "Germany"]
value = [300, 100, 2000, 800, 10000, 400, 5000]
map.add("", [list(z) for z in zip(country, value)], "world")
map.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
map.set_global_opts(
title_opts=opts.TitleOpts(title="Map-世界地图"),
visualmap_opts=opts.VisualMapOpts(max_=5000),)
map.render('d://map.html')
%层次分析
disp('请输入判断矩阵A')
A=input('A=');
[n,n] = size(A);
% % % % % % % % % % % % %方法1: 算术平均法求权重% % % % % % % % % % % % %
Sum_A = sum(A);
SUM_A = repmat(Sum_A,n,1);
Stand_A = A ./ SUM_A;
disp('算术平均法求权重的结果为:');
disp(sum(Stand_A,2)./n)
% % % % % % % % % % % % %方法2: 几何平均法求权重% % % % % % % % % % % % %
Prduct_A = prod(A,2);
Prduct_n_A = Prduct_A .^ (1/n)
disp('几何平均法求权重的结果为:');
disp(Prduct_n_A ./ sum(Prduct_n_A))
% % % % % % % % % % % % %方法3: 特征值法求权重% % % % % % % % % % % % %
[V,D] = eig(A);
Max_eig = max(max(D));
[r,c]=find(D == Max_eig , 1);
disp('特征值法求权重的结果为:');
disp( V(:,c) ./ sum(V(:,c)) )
% % % % % % % % % % % % %下面是计算一致性比例CR的环节% % % % % % % % % % % % %
CI = (Max_eig - n) / (n-1);
RI=[0 0.0001 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]; %注意哦,这里的RI最多支持 n = 15
% 这里n=2时,一定是一致矩阵,所以CI = 0,我们为了避免分母为0,将这里的第二个元素改为了很接近0的正数
CR=CI/RI(n);
disp('一致性指标CI=');disp(CI);
disp('一致性比例CR=');disp(CR);
if CR<0.10
disp('因为CR<0.10,所以该判断矩阵A的一致性可以接受!');
else
disp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!');
end
#双层饼状图
from matplotlib import pyplot as plt
import numpy as np
size = 0.25
base = 50
plt.rcParams['font.family'] = 'SimHei'
fig, ax = plt.subplots(figsize=(10, 10))
vals_middle = np.array([
[47.5, 11.7, 15.2, 9.6],
[0, 44.8, 7.5, 0],
[9.2, 68.5, 0, 0],
[1.2, 7.2, 0, 0],
[80, 0, 0, 0],
[1.7, 18.9, 0, 0]
])
vals_outer = np.array([
[47.5, 11.7, 15.2, 9.6],
[0, 36.6, 8.2, 7.5],
[9.2, 38.1, 30.4, 0],
[1.2, 5.8, 1.4, 0],
[80, 0, 0, 0],
[1.7, 18.9, 0, 0]
])
vals_inner = vals_middle.sum(axis=1)
# 最内圈使用的数值为内圈各类数据加上base
vals_first = vals_inner + base
'''
第二圈使用的数值, 因为最内圈每个类别都加上了base, 所以为了确保第二圈的数值和内圈相匹配, 第二圈的各类别要按照各自所占的比例分配各类的总数值.
'''
vals_second = np.zeros((6, 4))
for i in range(6):
s_a = vals_first[i]
s_b = vals_middle[i].sum()
# 如果第二圈某类总数值为0, 则分配base.
if s_b == 0.0:
vals_second[i][1] = base
continue
for j in range(4):
vals_second[i][j] = (vals_middle[i][j] / s_b) * s_a
# 第三圈使用的数值, 和上方同理
vals_third = np.zeros((6, 4))
for i in range(6):
s_a = vals_first[i]
s_b = vals_outer[i].sum()
if s_b == 0.0:
vals_third[i][1] = base
continue
for j in range(4):
vals_third[i][j] = (vals_outer[i][j] / s_b) * s_a
# 获取colormap tab20c和tab20b的颜色
cmap_c = plt.get_cmap("tab20c")
cmap_b = plt.get_cmap("tab20b")
# 使用tab20c的全部颜色和tab20b中的 5至8 颜色
cmap_1 = cmap_c(np.arange(20))
cmap_2 = cmap_b(np.array([4, 5, 6, 7]))
# 内圈的颜色是每4个颜色中色彩最深的那个. vstack是将两类颜色叠加在一起
inner_colors = np.vstack((cmap_1[::4], cmap_2[0]))
# 外圈的颜色是全部24种颜色
outer_colors = np.vstack((cmap_1, cmap_2))
labels_first = ["餐厨废弃物\n{}万吨".format(vals_inner[0]),
"农业秸秆\n{}万吨".format(vals_inner[1]),
"水草\n151.2万吨",
"园林绿化\n废弃物\n{}万吨".format(vals_inner[3]),
"淤泥\n432.0万吨",
"畜禽粪便\n21.6万吨"
]
labels_seocnd = [
"未分类收集\n67.6万吨",
"生物干化\n3.7万吨",
"厌氧发酵\n10.2万吨",
"油水分离\n2.6万吨",
"",
"粉碎\n46.8万吨",
"好氧发酵\n3.5万吨",
"",
"未处理\n4.2万吨",
"藻水分离\n147.0万吨",
"",
"",
"未处理\n1.2万吨",
"粉碎\n7.2万吨",
"",
"",
"堆放\n432.0万吨",
"",
"",
"",
"未处理\n0.7万吨",
"好氧发酵\n19.9万吨",
"",
"",
]
labels_third = [
"未处理\n67.5万吨",
"肥料化、发电\n3.7万吨",
"沼气、沼渣发电\n10.2万吨",
"焚烧\n2.6万吨",
"",
"还田\n42.6万吨",
"燃料化\n4.2万吨",
"肥料化\n3.5万吨",
"未利用\n4.2万吨",
"燃料化\n80.2万吨",
"肥料化\n66.8万吨",
"",
"未利用\n1.2万吨",
"肥料化\n5.8万吨",
"燃料化\n1.4万吨",
"",
"未利用\n432.0万吨",
"",
"",
"",
"未利用\n0.7万吨",
"肥料化\n19.9万吨",
"",
"",
]
handles, labels = ax.pie(vals_first, radius=1 - size - size,
labels=labels_first,
labeldistance=0.5, rotatelabels=True, textprops={'fontsize': 11},
colors=inner_colors, wedgeprops=dict(width=size, edgecolor='w'))
ax.pie(vals_second.flatten(), radius=1 - size, colors=outer_colors,
labels=labels_seocnd,
labeldistance=0.7, rotatelabels=True, textprops={'fontsize': 11},
wedgeprops=dict(width=size, edgecolor='w'))
ax.pie(vals_third.flatten(), radius=1, colors=outer_colors,
labels=labels_third,
labeldistance=0.8, rotatelabels=True, textprops={'fontsize': 11},
wedgeprops=dict(width=size, edgecolor='w'))
plt.title('某市有机废弃物产生、处理、利用情况', fontsize=25)
plt.legend(handles=handles, labels=[
"餐厨废弃物",
"农业秸秆",
"水草",
"园林绿化废弃物",
"淤泥",
"畜禽粪便"],
loc=1
)
plt.legend(bbox_to_anchor=(1.2,1.12))
plt.show()
标签:disp,labels,建模,学习,cmap,数学,vals,opts,万吨 来源: https://blog.csdn.net/qq_52050351/article/details/122709351