BNU-FZH

fengzhenhua@outlook.com

简介

在科研工作中需要求解一些方程,这些方程除了数值解法外没有更好的求解方式,所以通过 Python 或其他程序将函数的映射关系保存为一个 csv 文件,然后随时都可以用绘图软件作图显示。如果不保存数据,每次分析或交流时都要重新跑一遍程序,显然在时间上是不合算的,所以必须将复杂方程的结果保存下来。本文介绍使用 Python 保存函数图象为 csv文件的操作流程。

实例

python3 源码

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
#! /usr/bin/env python3
from os import walk
import numpy as np
import matplotlib.pyplot as plot
from pylab import *
import pandas as pd
import math
import tkinter as tk

x0=-0.2 #初始值z0的x0
y0=0 #初始值z0的y0
a=4 #绘制图的横轴大小
step=0.01 #绘制点的步长
zoom=1.0 #放大倍率

x=np.arange(-a/(2.0*zoom)+x0,a/(2.0*zoom)+x0,step)
y=x**2+2*x+1
z=3*np.sin(x)

data = {
`xd': x ,
'yd': y ,
'zd': z
}
u = pd.DataFrame(data)
u.to_csv('func.csv')

编程思路

  • x=np.arange(-a/(2.0*zoom)+x0,a/(2.0*zoom)+x0,step) 建立自变量等间隔划分的一个列向量.
  • y=x**2+2*x+1 根据自变量建立了一个二元函数映射列向量.
  • z=3*np.sin(x) 根据自变量建立了一个三解函数映射列向量.
  • 使用三组列向量构建数据表格 data.
  • 使用pandasDataFrame函数建立data对应的数据,并保存为func.csv文件.
  • 使用veusz导入func.csv,选择对应的列数据便可以绘制相应的函数图象.

参考文章

原本使用 Linux 和 Windows11 双系统电脑工作的非常好,直到有一天我更换了 4k 显示器,这时 Grub 尽管可以配置成 WhiteSur 主题,也相当美观,但是每次开机时显示这个 4k 的背景图片都相当慢。如果不使用主题,命令行的启动方式有些不友好,于是决定尝试安装另一个引导加载程序 refind, 因为它默认的配置下启动采用图形模式,同时也要注意它只支持 uefi.

安装

1
2
sudo pacman -S refind
sudo refind-install

注意:不必担心引导多系统的问题,它也能像grub一样自动检测电脑各硬盘中安装的操作系统,并自动添加到启动菜单中。

安装主题

下载安装主题

1
2
3
git clone git@github.com:lukechilds/refind-ambience.git
sudo mkdir /boot/efi/EFI/refind/themes
sudo cp -r refind-ambience /boot/efi/EFI/refind/themes/

启用主题

在文件/boot/efi/EFI/refind/refind.conf的最后添加上如下启用主题配置

/boot/efi/EFI/refind/refind.conf
1
include themes/refind-ambience/theme.conf

卸载 Grub

Before removing grub, make sure that some other boot loader is installed and configured to take over.

$ efibootmgr
1
2
3
4
Boot0000* Windows Boot Manager  HD(2,GPT,4dabbedf-191b-4432-bc09-8bcbd1d7dabf,0x109000,0x32000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)
Boot0001* GRUB HD(2,GPT,4dabbedf-191b-4432-bc09-8bcbd1d7dabf,0x109000,0x32000)/File(\EFI\GRUB\grubx64.efi)
Boot0002* Linux-Firmware-Updater HD(2,GPT,5dabbedf-191b-4432-bc09-8bcbd1d7dabf,0x109000,0x32000)/File(\EFI\arch\fwupdx64.efi)
Boot0003* Linux Boot Manager HD(2,GPT,4dabbedf-191b-4432-bc09-8bcbd1d7dabf,0x109000,0x32000)/File(\EFI\systemd\systemd-bootx64.efi)

If BootOrder has grub as the first entry, install another bootloader to put it in front, such as systemd-boot above. grub can then be removed using its bootnum.

1
sudo efibootmgr --delete-bootnum -b 1

注意:如果您不想删除Grub,那也可以在/boot/efi/EFI/refind/refind.conf 查找dont_scan_dirs, 然后把不想显示的Grub菜单启动项添加在这里。由于EFI分区空间只有500M, 所以在使用熟练后还是建议只保留一个引导程序。

参考文章

程序源代码

由于毕业论文要切换成非线性的缘故,需要我拿出一些时间来研究绘制各种分叉图。下面举一个例子来说明绘图的思路:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from tqdm import tqdm
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure(figsize=(10,8),dpi=100)
def LogisticMap():
mu = np.arange(0, 4, 0.01)
x = 0.1 # 初值
iters = 1000 # 不进行输出的迭代次数
last = 200 # 最后画出结果的迭代次数
for i in tqdm(range(iters+last)):
x = mu * x * (1 - x)
if i >= iters:
plt.plot(mu, x, alpha=0.5) #
plt.ylim(0, 1)
plt.xlim(0, 4)
plt.title(r' $x_{n+1} = \mu x_{n} (1-x_{n}).$ n = '+ str(i+1) )
plt.ylabel('x-Random number')
plt.xlabel('r-Rate')
plt.show()
LogisticMap()

绘图分析

  1. 绘图的叠代公式 \[\begin{equation}\label{eq:diedai} x_{n+1}=\mu x_n(1-x_n) \qquad 0\leq \mu\leq 4, 0<x<1 \end{equation}\]

  2. 将参数\(\mu\)\(0\)\(4\)均分成\(100\)份,然后将其作为自变量,遍历区间取值。

  3. 对于任意一个\(\mu\)值,选择初值 \(x_0=0.1\), 使用式\(\eqref{eq:diedai}\)叠代\(1000\)次, 但是这些叠代值并不输出, 然后输出\(1001\)次到\(1200\)次的叠代结果。 其原理为:如果参数\(\mu\)在某个值时,无数次叠代后它会收敛到某个值附近,那这样的点就是一个嘛吸引点。但是,有的点以无数次叠代后仍然不收敛,所以在固定一个较大的次数\(1000\)后,再叠代\(100\)次, 将这\(100\)次的结果输出,就能判断这\(100\)个点的分布情况。

当光入射到样品上,入射光子与样品中的分子或原子发生碰撞散射改变运动方向。根据光子能量是否发生变化分为弹性散射非弹性散射

弹性散射

光子能量没有发生变化的散射叫弹性散射。弹射散射有Rayleigh scattering)和Mie scattering)。当散射微粒的直径远小于入射光波长时,一般小于波长\(1/10\),发生瑞利散射,强度与波长四次方成反比。当微粒尺寸增大到与波长相当时,发生米氏散射,强度与波长二次方成反比,且随着微粒增大,散射强度变弱。半导体中的弹性散射多为瑞利散射。

非弹性散射

光子能量的散射叫非弹性散射。非弹性散射中,散射光子能量减小的散射称为斯托克斯散射(Stokes),散射光子能量增加的散射称为反斯托克斯散射(Anti-Stokes)。散射光能量的改变与半导体中的声子有关,光学声子(Optical photon,OP)参与的称拉曼散射(Raman scattering),声学声子(Acoustic photon,AP)参与的称布里渊散射(Brillouin scattering)。声学声子能量较低,因此布里渊散射频移较小。光学声子能量略高,拉曼散射频移略大。拉曼散射和布里渊散射都有斯托克斯线和非斯托克斯线。

特性分析

在散射光中,绝大部分光都是瑞利散射,拉曼散射和布里渊散射都非常弱。

对于拉曼散射,一般情况下,反斯托克斯线比斯托克斯线低,因为处于振动基态能级的粒子数远大于振动激发态的粒子数,粒子吸收能量的比例远大于释放能量的比例。所以在拉曼光谱测试中,常测试的是斯托克斯线。晶格中的的光学声子对应有横光学声子(TO)和纵光学声子(LO),因此拉曼散射光具有偏振性,偏振与晶体的结构对称性有关。

拉曼散射实验中的两个难点,一是散射光强度很低,需要高精度的探测器,二是散射光谱线距离入射激光很近,需要排除入射激光的影响。拉曼散射的谱线仅与晶体结构有关,与振动和转动能级有关,与入射光频率无关,因此可以使用拉曼散射进行物质的鉴定和分析。

本文略调整了一下排版,全文引用自:布里渊散射,拉曼散射,瑞利散射的区别

2024年11月07日微信在其官方网站https://weixin.qq.com/正式上线并提供测试版 App 下载. 微信官方表示,此次发布的 Linux 版本在架构上进行了全面重构,不仅提升了性能,还实现了与 Windows 、 macOS 等平台在功能和界面上的一致性。这包括消息撤回、朋友圈浏览刷新、通讯录界面改版以及深色与浅色模式的切换等。

ArchLinux 安装 WeChat

1
2
paru -S wechat-bin
sudo pacman -S noto-fonst-cjk

参考文章

科研工作中离不开绘制各种各样的科研图片,通过程序可以将数据保存下来,然后使用绘图软件绘制图片。其中CSV数据文件( Comma Separated Values, 逗号分隔的值)是比较常用的文件,本文介绍CSV数据文件。

CSV 文件优点

  • 简单易懂:CSV 文件基于纯文本格式,因此可以使用任何文本编辑器(如neovim)轻松打开和编辑。
  • 数据兼容性:CSV 文件中的数据可以很容易地跨平台进行传输和处理,任何具有 CSV 处理功能的软件(如Microsoft ExcelGoogle Sheets、甚至编程语言库)都能处理该类型的文件。
  • 资源占用低:CSV 文件以纯文本形式存储数据,其体积相对较小,便于节省存储空间。

CSV 文件结构

  • 每行表示一条记录:CSV 文件中的每一行代表一条记录,相当于数据库中的一行数据。
  • 逗号分隔:每行数据中,使用逗号, 进行数据分隔,代表不同的数据。
  • 引号包围:当数据单元格中的内容含有逗号时,为避免混淆,需要引号 (单引号 ' 或双引号 ")将这个数据包围起来,防止误认为是两个不同数据。

ArchLinux是一个优秀的Linux发行版,但是在使用Paru安装AUR中的软件时,很多软件依赖于Github上的软件,但有时候它不能访问,为此本人开发了脚本ParuAxel.sh.

配置Github镜像

为了提高Github的访问速度,可以设置git的下载镜像网站,于是首先配置git如下:

~/.gitconfig
1
2
3
4
5
6
7
8
9
10
11
[user]
email = YourEmail
name = YourName
; [url "https://521github.com/"]
; [url "https://githubfast.com/"]
; [url "https://git.homegu.com/"]
; [url "https://kkgithub.com/"]
; [url "https://github.hscsec.cn/"]
; [url "https://gitclone.com/github.com/"]
[url "git@github.com:"]
insteadOf = https://github.com/

ParuAxel 脚本

/usr/bin/ParuAxel
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
#! /bin/sh
#
# Program: ParuAxel.sh
# Version: V1.4
# Author : Zhen-Hua Feng
# Email : fengzhenhua@outlook.com
# Date : 2024-11-06 14:08
# Copyright (C) 2023 feng <feng@arch>
#
# Distributed under terms of the MIT license.
#
GIT_DOMIN=`echo $2 | cut -f3 -d'/'`;
GIT_OTHER=`echo $2 | cut -f4- -d'/'`;
GIT_INIT="https://github.com/"
GCF=/home/$USER/.gitconfig
GIT_MIR=$(grep "url \"http" $GCF)
GIT_SIT=(${GIT_MIR[*]//" "/""})
GIT_SIT=(${GIT_SIT[*]//";"/""})
GIT_SIT=(${GIT_SIT[*]//"[url\""/""})
GIT_SIT=(${GIT_SIT[*]//"\"]"/""})
GIT_DETECT(){
wget --spider -T 5 -q -t 2 $1
}
i=0 ; j=0
case "$GIT_DOMIN" in
"github.com")
if [ -e $GCF ]; then
while [[ $i -lt "${#GIT_SIT[*]}" ]]; do
GIT_DETECT ${GIT_SIT[$i]}
if [[ $? = 0 ]]; then
GIT_URL=${GIT_SIT[$i]}$GIT_OTHER
i=${#GIT_SIT[*]} ; j=1
else
let i+=1
fi
done
if [[ $j -eq 0 ]]; then
GIT_URL="$GIT_INIT$GIT_OTHER"
fi
else
GIT_URL="$GIT_INIT$GIT_OTHER"
fi
echo "Download from mirror $GIT_URL";
# Single-threaded, enabled by default
/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o $1 $GIT_URL;
# Multi-threading, which may not be supported by some mirror websites
# /usr/bin/axel -n 15 -a -o $1 $GIT_URL;
;;
*)
GIT_URL=$2;
/usr/bin/axel -n 15 -a -o $1 $GIT_URL;
;;
esac

编写思路:首先探测~/.gitconfig文件,提取所有的http镜像地址,然后按顺序测试镜像地址,遇到可以使用的镜像则设置为下载地址,同时停止继续探测。如果全部探测完成后没有发现可用地址,则仍然使用https://github.com的原始地址。由于不是所有镜像都支持axel多线程下载,所以默认开启curl下载。为了提高效率,当探测到可用镜像时就停止了继续探测其他镜像,但是这不能保证探测到的镜像速度最快,所以在此版中应当尽量将速度快的镜像排在~/.gitconfig的前面,下一版计划实现自动速度的探测。

/etc/makepkg.conf
1
2
3
4
5
6
DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
'ftp::/usr/bin/axel -n 15 -a -o %o %u'
'http::/usr/bin/axel -n 15 -a -o %o %u'
'https::/usr/bin/ParuAxel %o %u'
'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o')

具体设置

基本用法

1
eval command-line

其中command-line是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次。

举例解释

1
2
pipe="|"
eval ls $pipe wc -l

shell1次扫描命令行时,它替换出变量$pipe的值,接着eval使它再次扫描命令行,这时shell作为管道符号了。

参考文章

在部署博客时,首先探测目标网站是否畅通是一个必要的环节。然而之前的探测方法依赖于返回码,但是不同的网站返回码不同,所以这不是一个很好的方法,本文的目标就是解决这个探测通用性的问题。

wget方法

wget 探测网站
1
wget --spider -T 5 -q -t 2 https://gitlab.com ; echo $?

若返回值为\(0\), 则表示目标网站可以正常访问,否则表示网络不通。

wget的常用参数为:

1
2
3
4
5
--spider                   模拟爬虫的行为去访问网站,但不会下载网页
-q, --quiet 安静的访问,禁止输出,类似-o /dev/null功能
-o, --output-file=FILE 记录输出到文件
-T, --timeout=SECONDS 访问网站的超时时间
-t, --tries=NUMBER 当网站异常时重试网站的次数

curl方法

curl 探测网站
1
curl -s -o /dev/null https://gitlab.com ; echo $?

若返回值为0, 则代表正常. 这个方法的优点在于与返回的状态码无关,是一个通用方案。

curl 探测网站---状态码方法
1
curl -I -m 5 -s -w "%{http_code}\n" -o /dev/null www.baidu.com

上述方法,会返回一个状态码,若为200则代表www.baidu.com可以正常访问。但是,不同网站的状态码不同,所以这不是一个友好的方案,因此将此方法仅记录在此,但编写脚本时尽量不要使用。

参考文章

  • 测试网站链接是否可用(wget和curl)

  • 注意:在上述文章中,测试代码与echo $?前使用了管道符号|, 这是不对的. 在本文中已经更正为;, 这表示无论前面的代码是否正确运行后面的echo照样执行,这样才能正确返回上一步的$?状态,实现准确判断。

自定义一个函数并调用

1
2
3
4
5
6
7
8
9
import numpy as np

def func_x(a):
y = a + 1
return y

print(func_x(x)) # 调用
# 输出
# 2

frompyfunc 函数

如果a不是一个数,而是一个向量或数组呢?这时需要使用numpy中的通用函数np.frompyfunc(func,1,1), 这里的参数func指的是你要使用的函数,第二个参数为func中的参数个数,第三个参数为func中的返回值的个数。现在进一步改写为计算数组的情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np

def func_x(a):
y = a + 1
return y

A = [0, 1, 2]
func_ = np.frompyfunc(func_x, 1, 1)

y = func_(A)

print(y)
# 结果:
# [1 2 3]

参考文章

np.frompyfunc()函数的使用 Numpy | 函数向量化