Python_Matplotlib极坐标系作全向反应谱图

\[ a_\theta(t)=a_x(t)\cos\theta+a_y(t)\sin\theta \]

  1. 通过NS和EW向地震波生成360度全方向地震波
  2. 计算出该条地震动反应谱
  3. 在极坐标系上使用等高线工具绘制全向反应谱图
1
2
3
4
5
def graph(theta,r,value,name):#theta,r,value,命名(包含路径)
fig, axes = plt.subplots(subplot_kw=dict(projection='polar'),figsize=(10,10))
contourplot = axes.contourf(theta,r,value,cmap=plt.cm.jet)
plt.colorbar(contourplot, shrink=.6, pad=0.08)
plt.savefig(name)
  • 只需要计算0-180度反应谱去最大值,\(\theta+180\)取最小值即可,减少计算量
阅读全文 »

题目

Given an array rectangles where rectangles[i] = [xi, yi, ai, bi] represents an axis-aligned rectangle. The bottom-left point of the rectangle is (xi, yi) and the top-right point of it is (ai, bi).

Return true if all the rectangles together form an exact cover of a rectangular region.

Example 1:

img
阅读全文 »

需求

  • 例如frpc内网穿透服务要求在重启后立即执行,不要等到用户登入后

方案

  • 计划任务中使用SYSTEM用户进行
  • QQ截图20210914173300

Python基于中心差分及Newmark法计算地震波反映谱

地震工程作业代码

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import os
import math
import numpy as np
import matplotlib.pyplot as plt
import scipy

class spectrum:
sw=np.array([]) #地震波a
v=np.array([]) #地震波速度
su=np.array([]) #地震波位移
tf=np.array([]) #调幅后地震波a

u=np.array([])
u0=np.array([])
u00=np.array([])

saT=np.array([])
sa=np.array([]) #谱加速度
sv=np.array([]) #谱速度
sd=np.array([]) #谱位移

PGA=0
PGD=0
PGV=0
t=0

def __init__(self,path,t):#路径,步长
file_4=open(path,"r")
str4="" #文件前四行
for p in range(0,4):
str4=str4+file_4.readline()
data=file_4.readlines()# 读取后面全部数据
file_4.close() #获取前四行
lit=[]
for d in data:
tmpd=d.split()
for num_tmpd in range(0,len(tmpd)):
lit.append(float(tmpd[num_tmpd]))
self.sw=np.array(lit)
self.t=t
return

def newmark_beta(self,T,ksi=0.05,gamma=0.5,beta=0.25):#步长,周期,地震波
if T==0:
T=0.00000001
n=len(self.sw)
m=1.0
c=2*m*ksi*(2*np.pi/T)
#分别为加速度,速度,位移
u00=np.zeros(n)
u0=np.zeros(n)
u=np.zeros(n)
k=(2*np.pi/T)**2*m
u00[0]=-self.sw[0]-c*u0[0]-k*u[0]
a1=m/(beta*(self.t**2))+gamma*c/(beta*self.t)
a2=m/(beta*self.t)+(gamma/beta-1)*c
a3=(1/(2*beta)-1)*m+self.t*(gamma/(2*beta)-1)*c
k_hat=k+a1 #k^/hat

for i in range(1,n):
p_hat=-self.sw[i]+a1*u[i-1]+a2*u0[i-1]+a3*u00[i-1]
u[i]=p_hat/k_hat
u0[i]=gamma/(beta*self.t)*(u[i]-u[i-1])+(1-gamma/beta)*u0[i-1]+self.t*(1-gamma/(2*beta))*u00[i-1]
u00[i]=1/(beta*(self.t**2))*(u[i]-u[i-1])-u0[i-1]/(beta*self.t)-(1/(2*beta)-1)*u00[i-1]
self.u=u
self.u0=u0
self.u00=u00+self.sw
return u,u0,u00+self.sw

def central_difference(self,T,ksi=0.05,gamma=0.5,beta=0.25):
m=1.0
n=len(self.sw)
u00=np.zeros(n)
u0=np.zeros(n)
u=np.zeros(n+1)
c=2*m*ksi*(2*np.pi/T)
k=(2*np.pi/T)**2*m
u00[0]=-self.sw[0]-c*u0[0]-k*u[0]
u_1=u[0]-self.t*u0[0]+self.t**2*u00[0]/2
k_hat=m/(self.t**2)+c/(2*self.t)
a=m/(self.t**2)-c/(2*self.t)
b=k-2*m/(self.t**2)
for i in range(n):
if i==1:
p_hat=-self.sw[i]-a*u_1-b*u[i]
else:
p_hat=-self.sw[i]-a*u[i-1]-b*u[i]
u[i+1]=p_hat/k_hat
u0[i]=(u[i+1]-u[i-1])/(2*self.t)
u00[i]=(u[i+1]-2*u[i]+u[i-1])/(self.t**2)
self.u=u[:n]
self.u0=u0
self.u00=u00+self.sw
return

def get_PGA(self):
self.PGA=max(abs(self.sw))
return max(abs(self.sw))

def get_PGV(self):
self.PGV=max(abs(self.v))
return max(abs(self.v))

def get_PGD(self):
self.PGD=max(abs(self.su))
return max(abs(self.su))

def get_sa(self,begin,end,step):
T=np.arange(begin,end,step)
sa=np.array([])
sv=np.array([])
su=np.array([])
for i in T:
u,v,a=self.newmark_beta(i)
sa=np.append(sa,max(abs(a)))
sv=np.append(sv,max(abs(v)))
su=np.append(su,max(abs(u)))
self.saT=T
self.sa=sa
self.sd=su
self.sv=sv
return

def get_v(self):#步长,地震波
v=[]
for i in range(len(self.sw)):
v.append(np.trapz(self.sw[:i+1],dx=self.t))
self.v=np.array(v)
return v

def get_u(self):
v=self.get_v()
u=[]
for i in range(len(self.sw)):
u.append(np.trapz(v[:i+1],dx=self.t))
self.su=np.array(u)
return u

def tiaofu_sa(self,T,target):# 地震波步长 地震波 要调幅到的周期和值'
u,v,a=self.newmark_beta(T)
sa=max(abs(a))
self.tf=self.sw
self.sw=self.sw*(target/sa)
self.get_v()
self.get_u()
return target/sa

def fypa(self,T,x,path):
y=np.loadtxt(path)
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(10,5))
plt.title("标准加速度反应谱")
self.get_PGA()
plt.plot(T,x/self.PGA,label="python")
plt.plot(T,y/self.PGA,label="SPECTR")
plt.xlabel("T(s)")
plt.ylabel("$\\beta$")
plt.legend()

def fypv(self,T,x,path):
y=np.loadtxt(path)/1000
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(10,5))
plt.title("标准速度反应谱")
self.get_PGV()
plt.plot(T,x/self.PGV,label="python")
plt.plot(T,y/self.PGV,label="SPECTR")
plt.xlabel("T(s)")
plt.ylabel("$\\beta$")
plt.legend()

def fypu(self,T,x,path):
y=np.loadtxt(path)/1000
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(10,5))
plt.title("标准位移反应谱")
self.get_PGD()
plt.plot(T,x/self.PGD,label="python")
plt.plot(T,y/self.PGD,label="SPECTR")
plt.xlabel("T(s)")
plt.ylabel("$\\beta$")
plt.legend()

def sw_a(self):
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
plt.figure(figsize=(10,5))
plt.title("地震波加速度时程")
t=np.linspace(0,len(self.sw)*self.t,len(self.sw))
plt.plot(t,self.sw)
plt.xlabel("t(s)")
plt.ylabel("a(g)")
#plt.legend()

使用实例

阅读全文 »

基于GitHub-webhook进行Hexo自动部署

  1. wget https://github.com/yezihack/github-webhook/releases/download/v1.5.0/github-webhook1.5.0.linux-amd64.tar.gz
  2. tar -zxvf github-webhook1.5.0.linux-amd64.tar.gz
  3. cp github-webhook /usr/local/bin/
  4. 写执行脚本vim webhook.sh
1
2
3
4
#!/bin/bash
cd /root/hexo/blog #注意:替换自己hexo所在路径
git pull
hexo g -d
  1. github-webhook -b [shell脚本路径] -s [github webhook的密码]

详细配置webhook官方脚本有详解,地址在下面

阅读全文 »

Step.1 安装samba

yum install samba

Step.2 添加samba用户

smbpasswd -a samba 必须为系统存在的用户

smbpasswd -e samba激活用户

阅读全文 »

Step.1 安装pm2

npm install pm2 -g

Step.2 在source目录下创建 start.js

1
2
3
4
5
6
7
var process = require('child_process');

process.exec(' hexo g -d', function (error, stdout, stderr) {
if (error !== null) {
console.log('exec error: ' + error);
}
});

Step.3 在source目录下创建 watch.json

阅读全文 »

CSV是可以直接导入Mysql的,不过有时候条目不对应,CSV数量过多,直接导入就不方便了

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import os
import csv
import pymysql
conn=pymysql.connect(host='xx.xx.xx.xx',port=3306,user='root',password='password',db='weibo',charset='utf8mb4') # 数据库连接信息
cursor=conn.cursor()
for root,dirs,files in os.walk(r"E:\"): #遍历目录
for f in files:
if f.split(".")[-1] == "csv":
user_id=f.split(".")[0]
csv_file=open(os.path.join(root,f),"r",encoding='utf-8')
csv_reader=csv.reader(csv_file)
csv_comment=list(csv_reader)
# print("test")
for t in csv_comment:
if t[0].find("微博id") > -1:
continue
insert="INSERT INTO `weibo` (`id`, `user_id`, `content`, `article_url`, `original_pictures`, `retweet_pictures`, `original`, `video_url`, `publish_place`, `publish_time`, `publish_tool`, `up_num`, `retweet_num`, `comment_num`) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}', '{9}','{10}', '{11}', '{12}', '{13}');".format(t[0],user_id,t[1],t[2],t[3],"NULL","1",t[4],t[5],t[6],t[7],t[8],t[9],t[10]) #对应的插入语句
try:
cursor.execute(insert)
conn.commit()
print("成功")
except:
print("失败")

由于服务器迁移导致自用图床chevereto的数据库丢失(忘记备份是大锅,那段时间忙于考试了),但多处引用了外链不方面自身再次上传,所以根据数据文件补全数据库

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import os
import hashlib
from PIL import Image

def update_info(path,f,root): #查询图片信息,生成SQL语句
image_name=os.path.splitext(f)[0]
image_extension=f.split(".")[-1]
file=open(path,"rb")
image_size=os.path.getsize(path)
im=Image.open(path)
image_width=im.size[0]
image_height=im.size[1]
image_date=path.split("\\")[2]+'-'+path.split("\\")[3]+"-"+path.split("\\")[4]+" 12:00:00"
image_user_id=1
image_uploader_ip="60.211.13.123"
image_md5=hashlib.md5(file.read()).hexdigest()
image_original_filename=f
i_th=os.path.join(root,image_name+".th."+f.split(".")[-1])
i_md=os.path.join(root,image_name+".md."+f.split(".")[-1])
if(os.path.exists(i_th) and os.path.exists(i_md)):
image_chain=7
image_thumb_size=os.path.getsize(i_th)
image_medium_size=os.path.getsize(i_md)
else:
image_chain=5
image_thumb_size=os.path.getsize(i_th)
image_medium_size=0
info="INSERT INTO `chv_images` (`image_id`, `image_name`, `image_extension`, `image_size`, `image_width`, `image_height`, `image_date`, `image_date_gmt`, `image_title`, `image_description`, `image_nsfw`, `image_user_id`, `image_album_id`, `image_uploader_ip`, `image_storage_mode`, `image_storage_id`, `image_md5`, `image_source_md5`, `image_original_filename`, `image_original_exifdata`, `image_views`, `image_category_id`, `image_chain`, `image_thumb_size`, `image_medium_size`, `image_expiration_date_gmt`, `image_likes`, `image_is_animated`) VALUES (NULL, '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{5}', '{6}', NULL, '0', '1', NULL, '60.211.13.123', 'datefolder', NULL, '{7}', NULL, '{8}', NULL, '0', NULL, '{9}', '{10}', '{11}', NULL, '0', '0');".format(image_name,image_extension,image_size,image_width,image_height,image_date,image_name[:99],image_md5,f,image_chain,image_thumb_size,image_medium_size)
return info

#遍历图片储存文件夹,所有SQL语句写入文本
total =0
new_info=open("update_info.txt","w")
for root,dirs,files in os.walk(r"D:\images"):#这里写路径
for f in files:
#print(f)
if f.split(".")[-1] not in ["jpg","png"]:
#print(f.split(".")[-1])
continue
if f.split(".")[-2] in ["th","md"]:
#print(f.split(".")[-2])
continue
#print(root)
str_info=update_info(os.path.join(root,f),f,root)
#print(str_info)
new_info.write(str_info)
new_info.write("\n")
total=total+1
print(total)
#print(f)

说明

  • 可以通过pymysql直接写入数据库,我不想开远程数据库访问权限没有使用
  • 直接通过服务端命令行或者PHPmyadmin上传mysql执行即可
  • total的值很有用,本代码默认图床个人使用,图片所有者为id为1的用户。请在数据库chv_users中的user_image_count和chv_stats中total的stat_images加上total的值,否则仪表台的统计数据有误。
  • 修改数据库chv_stats中total的stat_disk_used为images文件夹实际大小,否则仪表台统计数据有误
  • 上述两条不影响使用,只影响观感
  • 另外由于服务器时间和照片时间不一致,容易存在照片信息时间与上传图片的时间文件夹不同,所以图片时间为按照真实时间填写,均设置为上传当天的中午12点,不影响使用。如果使用真实时间戳,导致与文件夹名对不上,后台图片会显示为空。
阅读全文 »
0%