前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Wolfram语言可视化沙皇邦巴核弹的影响

用Wolfram语言可视化沙皇邦巴核弹的影响

作者头像
WolframChina
发布2019-07-31 12:25:49
4920
发布2019-07-31 12:25:49
举报
文章被收录于专栏:WOLFRAM

几个星期前,我花了一个晚上阅读人类引爆的最大的核弹。 像往常一样,这让我想知道我是否可以用Wolfram语言做任何与此主题相关的事情。 在阅读了最大核弹的影响和半径这些影响的测量或观察后,我发现GeoGraphics非常方便实现这些。

1961年10月30日,世界上最大的核弹被苏联引爆,高于北极圈。 这就是沙皇邦巴(Tsar Bomba - 世界上最大的氢弹),约为58兆吨。

代码语言:javascript
复制
In[4]:= Entity["NuclearExplosion", 
  "UnionSovietSocialistRepublics10301961Test2"]["Yield"]
Out[4]= Quantity[5.8*10^4, "KilotonsOfTNT"]

该装置是一种“氢弹”,它是一种利用裂变爆炸来压缩氢气样品以产生更强大的热核聚变爆炸的装置。 它们还有一个更大的100兆吨装置,但由于担心人口稠密地区的放射性沉降以及飞行员无法及时逃离现场,因此从未引爆过。 就目前而言,由于冲击波导致飞机坠落1公里,沙皇邦巴爆炸几乎不允许飞行员逃跑,但飞行员能够安全地恢复和降落。 下面显示了一组同心圆盘,显示了这种爆炸的各种影响程度。

代码语言:javascript
复制
In[5]:= tsar = GeoPosition[{73.8072, 54.98167`}];
In[6]:= legend = Labeled[
   SwatchLegend[{Directive[Red, Opacity[.3]], Directive[Orange, Opacity[.3]], 
     Directive[Blue, Opacity[.2]], Directive[Yellow, Opacity[.2]], 
     Directive[Black, Opacity[.3]]}, {"3rd degree burns", "heat felt", 
     "shock wave visible", "glass windows broke", 
     "top of mushroom cloud visible"}, LegendFunction -> "Frame"], 
   Text[Style["Tsar Bomba Effects", Bold, 18]], Top];
In[8]:= text = {Text[Style["Moscow", 12], 
    Entity["City", {"Moscow", "Moscow", "Russia"}], {0, 1}], 
   Text[Style["St. Petersburg", 12], 
    Entity["City", {"SaintPetersburg", "SaintPetersburg", "Russia"}], {0, 1}],
    Text[Style["Greenland", 18], Entity["Country", "Greenland"]], 
   Text[Style["Sweden", 18], Entity["Country", "Sweden"]], 
   Text[Style["Svalbard", 18], Entity["Country", "Svalbard"]], White, 
   Text[Style["+", 36], GeoPosition[{90, 0}]]};
In[9]:= map[km_] := Grid[{
   {
    GeoGraphics[{
      GeoStyling[Opacity[.3]], Red, PointSize[.007], 
      Point[Entity["City", {"Moscow", "Moscow", "Russia"}]], 
      Point[Entity["City", {"SaintPetersburg", "SaintPetersburg", "Russia"}]],
      Point[tsar], GeoDisk[tsar, Quantity[100, "Kilometers"]],
      Black, text, 
      GeoVisibleRegion[
       GeoPosition[{73.80722222222222`, 54.98166666666667`, 67000}]],
      Orange, GeoDisk[tsar, Quantity[270, "Kilometers"]],
      GeoStyling[Opacity[.2]], Blue, 
      GeoDisk[tsar, Quantity[700, "Kilometers"]],
      Yellow, GeoDisk[tsar, Quantity[900, "Kilometers"]]},
     GeoGridRange -> {{-1.3, 1.3}, {-1, 1}} km/4000, 
     GeoBackground -> "ReliefMap", ImageSize -> {800, 600}, 
     GeoProjection -> "Orthographic", GeoCenter -> tsar, 
     GeoScaleBar -> "Miles", GeoZoomLevel -> 5], legend}
   }
  ]
In[11]:= map[500]

我们可以缩小一点,以便更好地根据各个地标了解这有多大。

代码语言:javascript
复制
map[1500]

我继续探索世界各地其他核爆炸的位置、日期和产量,并创建了一个动画,每帧显示爆炸1次。 首先,我使用EntityValue获取所有可用爆炸的数据。

代码语言:javascript
复制
nuc = EntityValue["NuclearExplosion", {"Entity", "Date", "Yield"}];

然后我只选择那些有所有必要数据并按日期排序的数据。

代码语言:javascript
复制
In[15]:= clean = Select[nuc, FreeQ[#, _Missing] &];

In[16]:= sorted = SortBy[clean, JulianDate[#[[2]]] &];

In[17]:= sorted // Length

Out[17]= 1913

出于规模限制,我需要定义最大的一个。

代码语言:javascript
复制
In[18]:= max = {#[[2]], Rule[#[[1]], #[[3]]]} &@SortBy[sorted, #[[3]] &][[-1]]

Out[18]= {DateObject[{1961, 10, 30, 8, 33, 27.}, "Instant", "Gregorian", 0.], 
 Entity["NuclearExplosion", "UnionSovietSocialistRepublics10301961Test2"] -> 
  Quantity[5.8*10^4, "KilotonsOfTNT"]}

In[19]:= rules = {#[[2]], Rule[#[[1]], #[[3]]]} & /@ sorted;

我使用GeoBubbleChart绘制所有爆炸,其气泡大小与其产量成正比。 许多爆炸发生在各个测试区域附近,所以有很多重叠的气泡。

代码语言:javascript
复制
In[24]:= GeoBubbleChart[{rules[[1 ;; length]][[All, 2]], {max[[2]]}}, ImageSize -> 800,
  GeoZoomLevel -> 2, GeoBackground -> "ReliefMap", GeoRange -> All, 
 ChartElements -> {Automatic, None}, ChartStyle -> {Red}]

可以使用以下程序生成从1945年一直持续到2017年的动画。

代码语言:javascript
复制
Do[
 Export["Frame" <> 
   ToString[
    PaddedForm[i - 1, 4, NumberPadding -> "0", 
     NumberSigns -> {"", ""}]] <> ".png", 
  GeoBubbleChart[{rules[[1 ;; i]][[All, 2]], {max[[2]]}}, 
   ImageSize -> {1920, 1080}, GeoZoomLevel -> 2, 
   GeoBackground -> "ReliefMap", GeoRange -> All, 
   ChartElements -> {Automatic, None}, ChartStyle -> {Red}, 
   PlotLabel -> 
    Style[DateString[
      rules[[i, 1]], {"DayNameShort", " ", "Day", " ", 
       "MonthNameShort", " ", "Year"}], {FontFamily -> "Consolas", 
      FontSize -> 42}]]],
 {i, 1, length, 1}]
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WOLFRAM 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档