APHCM_E

"第二问1"
import pandas as pd

#a)根据所附资料或您收集的资料,建立一个预测核武器数量的数学模型,并预测未来100年拥有核武器的国家;
#b)预测未来100年核武器数量的变化趋势,2123年核武器总数,以及每个国家的核武器数量。

proliferation=pd.read_excel('2022_APHCM_E_Data.xlsx',sheet_name='proliferation')
proliferation

a=[]
count=0
for i in proliferation['Year']:
    count=+1
    if count%10==0:
        a.append(1)
    elif count==1:
        a.append(1)
    else:
        a.append(0)

a.reverse()
proliferation['huizong']=a

temp=proliferation[proliferation['huizong']==1]
temp.to_excel('./Q2/proliferation.xlsx',index=None)
temp


stockpiles=pd.read_excel('2022_APHCM_E_Data.xlsx',sheet_name='stockpiles')
stockpiles

temp1=stockpiles.groupby('Year').sum()
temp1.reset_index(inplace=True,drop=False)
temp1

a=[]
count=0
for i in temp1['Year']:
    count=+1
    if count%10==0:
        a.append(1)
    elif count==1:
        a.append(1)
    else:
        a.append(0)
        
a.reverse()
temp1['huizong']=a

temp1.to_excel('./Q2/stockpiles1.xlsx',index=None)
temp1[temp1['huizong']==1].to_excel('./Q2/stockpiles10.xlsx',index=None)
temp1                

import matplotlib.pyplot as plt
import numpy as np

#用来正常显示中文标签
plt.rcParams['font.sana-serif']=['SimHei']

#用来正常显示负号
plt.rcParams['axes.unicode_minus']=False

#魔法函数:在notebook襄入图表
%matplotlib inline

#定义一个画板,尺寸为(8,5),dpi指定分辨率
plt.figure(figsize=(20,10),dpi=90)

plt.plot(temp1['Year'],temp1['Stockpile'])

plt.title("stockpiles-year diagram")
plt.xlabel("Year")
plt.ylabel('Stockpile')

plt.savefig('./Q2/stockpiles-year diagram.jpg')
plt.show()

import pandas as pd
import warnings
from sklearn.metrics import r2_score
warnings.filterwarnings('ignore')
from sklearn.metrics import mean_squared_error,mean_absolute_error
def mean_absolute_percentage_error(y_true, y_pred):
    
    return np.mean(np.abs((y_true - y_pred) / y_true))*100
def score(y_true, y_pred):
    #MARE
    print("MARE :")
    print(mean_absolute_percentage_error(y_true, y_pred))
    #RMSE
    print("RMSE :")
    print(np.sqrt(mean_squared_error(y_true, y_pred)))
    #MAE
    print("MAE :")
    print(mean_absolute_error(y_true, y_pred))
    #R2
    print("R2 :")
    print(np.abs(score(y_true, y_pred)))
    

import sys
!{sys.executable} -m  pip install --upgrade pip
!{sys.executable} -m pip install tensorflow  -i https://pypi.tuna.tsinghua.edu.cn/simple
!{sys.executable} -m pip install keras

dataset=temp1['Stockpile']
dataset

import matplotlib.pyplot as plt
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.models import Sequential, load_model

#将整型变为float
dataset = dataset.astype('float32')

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset.values.reshape(-1, 1))

def create_dataset(dataset,look_back):
#这里的ook_back与timestep相同
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back):
        a = dataset[i:(i+look_back)]
        dataX.append(a)
        dataY.append(dataset[i + look_back ])
    return numpy.array(dataX), numpy.array(dataY)

#训练墩据太少Look_back并不能过大
look_back = 1
trainX,trainY = create_dataset(dataset,look_back)
trainX = numpy.reshape(trainX, (trainX.shape[0], trainX.shape[1], 1))

#create and fit the LSTM network
model = Sequential()
model.add(LSTM(4, input_shape=( None,1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)
#model.save(os.path.join("DATA","Test" + ".h5"))
#make predictions



"模型验证"
#model = load_model(os.path.join("DATA","Test" + ".h5"))
trainPredict = model.predict(trainX)

#反归一化
trainPredict_ = scaler.inverse_transform(trainPredict)
trainY_= scaler.inverse_transform(trainY)

score(trainPredict_,trainY_)

plt.plot(temp1['Year'].values[1:].trainY_, label='observed data')
plt.plot(temp1['Year'].values[1:].trainPredict_, label='LSTM')
plt.title("stockpiles-year fitting diagram")
plt.xlabel("Year")
plt.ylabel('Stockpile')
plt.legend()
plt.savefig('./Q2/stockpiles-year fitting diagram.jpg')
plt.show()

x_input=trainY[-1]
predict_forword_number=101
predict_list=[]
predict_list.append(x_input)
while len(predict_list) < predict_forword_number:
    x_input = predict_list[-1].reshape((-1, 1, 1))
    yhat = model.predict(x_input,verbose=0)
    #预测新值
    predict_list.append(yhat)
    #取出
    
bb=scaler.inverse_transform(np.array([ i.reshape(-1,1)[:,0].tolist() for i in predict_list]))[1:]
bb    

pd.DataFrame(bb).to_excel('lstapre.xlsx',index=None)

import sys
#安装xgboost库
!{sys.executable} -m pip install xgboost -i https://pypi.tuna.tsinghua.edu.cn/simple
#安装lightgbm库
!{sys.executable} -m pip install lightgbm -i https://pypi.tuna.tsinghua.edu.cn/simple



temp1['rolling5']=temp1['stockpile'].rolling(5).mean()

a=[]
count=0
for i in temp1['Year']:
    count=+1
    if count%5==0:
        a.append(1)
    elif count==1:
        a.append(1)
    else:
        a.append(0)
        
a.reverse()
temp1['aa']=a
temp1



tempp=temp1[temp1['aa']==1]
tempp.reset_index(inplace=True,drop=True)
tempp.dropna(inplace=True)
tempp

tempp.to_excel('./Q2/rolling5.xlsx',index=None) #colling5

dataset=pd.concat([tempp[['Year,rolling5']],tempp['rolling5'].shift(1)],axis=1) #colling5
dataset.dropna(inplace=True,axis=0)
dataset.columns=['Year','X','y']
dataset[y]=dataset['y'].astype('int')
dataset

dataset.to_excel('./Q2/dataset_rolling5.xlsx',index=None)

import xgboost as xgb
import lightgbm as lgb
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
import warnings
warnings.filterwarnings('ignore')

train_X=dataset.iloc[:,1].valus.resreshape(-1, 1)
train_y=dataset.iloc[:,2].valus.resreshape(-1, 1)
text_X=dataset.iloc[::,1].valus.resreshape(-1, 1)
text_y=dataset.iloc[::,2].valus.resreshape(-1, 1)

#高维数据模型业界一般选择线性回归,速度快,准确率高
#线性回归
model_lr = lr.LinearRegression()
model_lr.fit(train_X,train_y)
#print('线性回归')

print(score(model_lr.predict(text_X.reshape(-1, 1)),text_y))

plt.plot(tempp['Year'].values[1:].text_y, label='observed data')
plt.plot(tempp['Year'].values[1:].model_lr.predict(text_X.reshape(-1, 1)), label='LinearRegression')
plt.title("stockpiles-year fitting diagram")
plt.xlabel("Year")
plt.ylabel('Stockpile')
plt.legend()
plt.savefig('./Q2/LinearRegression stockpiles-year-rolling5 fitting diagram.jpg')
plt.show()

aaaa=[]
for i in range(20):
    if i ==0:
        tt=model_lr.predict(text_X[-1].reshape(-1, 1))
    else:
        tt=model_lr.predict(np.array([aaaa[-1]]).reshape(-1, 1))
    aaaa.append(tt[0])
aaaa

#lightgbm回归
model_lgb = lgb.LGBMRegressor()
model_lgb.fit(train_X,train_y)
print('lgbm回归')

print(score(model_lgb.predict(text_X.reshape(-1, 1)),text_y))

print('\n...........')
plt.plot(temp1['Year'].values[:-1].text_y, label='observed data')
plt.plot(temp1['Year'].values[:-1].model_lgb.predict(text_X.reshape(-1, 1)), label='lgbm')
plt.title("stockpiles-year fitting diagram")
plt.xlabel("Year")
plt.ylabel('Stockpile')
plt.legend()
plt.savefig('./Q2/lgbm stockpiles-year fitting diagram.jpg')
plt.show()

aaaa=[]
for i in range(10):
    if i ==0:
        tt=model_lgb.predict(text_X[-1].reshape(-1, 1))
    else:
        tt=model_lgb.predict(np.array([aaaa[-1]]).reshape(-1, 1))
    aaaa.append(tt[0])
aaaa        

# xgboost回归
model_xgb = xgb.XGBRegressor()

model_xgb.fit(train_X,train_y)
print('xgboost回归')
print(score(model_xgb.predict(text_X.reshape(-1, 1)),text_y))

print('\n...........')
plt.plot(temp1['Year'].values[:-1].text_y, label='observed data')
plt.plot(temp1['Year'].values[:-1].model_xgb.predict(text_X.reshape(-1, 1)), label='XGBRegressor')
plt.title("stockpiles-year fitting diagram")
plt.xlabel("Year")
plt.ylabel('Stockpile')
plt.legend()
plt.savefig('./Q2/XGBRegressor stockpiles-year fitting diagram.jpg')
plt.show()

aaaa=[]
for i in range(10):
    if i ==0:
        tt=model_xgb.predict(text_X[-1].reshape(-1, 1))
    else:
        tt=model_xgb.predict(np.array([aaaa[-1]]).reshape(-1, 1))
    aaaa.append(tt[0])
aaaa
因为爆炸产生的冲击波从中心点向外传播,爆炸的能量越大,
在相同时间内冲击波传播得越远、蘑菇云的半径就越大.

测量从爆炸开始的不同时刻 t所对应的蘑菇云半径 r(t)
如下表所示:

t/ms

r(t)/m

t/ms

r(t)/m

t/ms

r(t)/m

t/ms

r(t)/m

t/ms

r(t)/m

0.10

11.1

0.80

34.2

1.5

44.4

3.53

61.1

15.0

106.5

0.24

19.9

0.94

36.3

1.65

46.0

3.80

62.9

25.0

130.0

0.38

25.4

1.08

38.9

1.79

46.9

4.07

64.3

34.0

145.0

0.52

28.8

1.22

41.0

1.93

48.7

4.34

65.6

53.0

175.0

0.66

31.9

1.36

42.8

3.26

59.0

4.61

67.3

62.0

185.0

%检验程序
data=[
 0.10 11.1 0.80 34.2 1.5 44.4 3.53 61.1 15.0 106.5
 0.24 19.9 0.94 36.3 1.65 46.0 3.80 62.9 25.0 130.0
 0.38 25.4 1.08 38.9 1.79 46.9 4.07 64.3 34.0 145.0
 0.52 28.8 1.22 41.0 1.93 48.7 4.34 65.6 53.0 175.0
 0.66 31.9 1.36 42.8 3.26 59.0 4.61 67.3 62.0 185.0
 ];
t=[];r=[];
for i=1:5 
    t=[t;data(:,2*i-1)];
    r=[r;data(:,2*i)]; 
end
r1=log(r);t1=log(t); 
s=polyfit(t1,r1,1);
b=s(1);a=s(2);
tt=0:0.1:70;
rr=exp(a)*tt.^b; 
plot(tt,rr,t,r,'+')

%使用非线性模型线性化技术和 polyfit函数进行数据拟合实验。最终确定爆炸能量e
%x=t.^(2/5);y=r;
%polyfit(x,y,1)

%用曲线拟合  
%z=polyfit(x,y,2) 
%f=polyval(z,x); 
%plot(t,r)
%plot(x,f)
%检验程序
x=log10(t*1e-3); 
y=5/2*log10(r)-x; 
plot(x,y,'+') 
xlabel('log10(t)'); 
ylabel('5/2*log10(r)-log10(t)'); 
c=mean(y) 
hold on; 
plot(x,c,'.-'); 
hold off; 
rou0=1.25; 
e=rou0*10^(2*c) 
kiloton=e/4.184e12

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值