Gumdrop 发布的文章

$5.0\times10^{-8}mol/L\ HCl溶液$

是强酸。

$$ [H^+]=[Cl^-]+[OH^-]=c_{HCl}+K_w/[H^+]\Rightarrow[H^+]=\frac{c_{HCl}+\sqrt{c_{HCl}^2+4K_w}}{2} \\ 10^{-8}$0.10mol/L\ H_3BO_3溶液、0.10mol/L\ 三乙醇胺溶液和0.01mol/L\ H_2O_2溶液$

一元弱酸和一元弱碱

1.第一种省略$K_ac/K_w=5800>10$

$$ [H^+]=[B(OH)_4^-]+[OH^-]=\frac{K_a[H_3BO_3]}{[H^+]}+K_w/[H^+]\Rightarrow[H^+]=\sqrt{K_a[H_3BO_3]+K_w} \\ 弱酸解离度小,则K_a[H_3BO_3]\approx K_ac_{H_3BO_3},在误差不大于10\%时,当K_ac/K_w>10时忽略K_w。 \\ K_a=5.8\times10^{-10},K_ac/K_w=5800>10,[H^+]=\sqrt{K_a[H_3BO_3]} \\ 由分析浓度定义和PBE,[H_3BO_3]=c_{H_3BO_3}-[B(OH)_4]=c-[H^+]+[OH^-],由于弱酸溶液中[H^+]\gg[OH^-],[H_3BO_3]=c-[H^+] \\ \ [H^+]=\sqrt{K_a(c-[H^+])}\Rightarrow[H^+]=\frac{-K_a+\sqrt{K_a^2+4K_ac}}{2} \\ $$

2.第二种省略$c/K_a>100$

$$ [H^+]=\sqrt{K_a(c-[H^+])} \\ 当c/[H^+]>10时可以忽略[H^+],此时[H^+]=\sqrt{K_ac},代回则c/K_a>100 \\ c/K_a>10^9,则[H^+]=\sqrt{K_ac}\approx 5.12 \\ 解离度\alpha=\sqrt{K_a/c},当解离度小于10\%时可以忽略酸度。此时: \\ \ [H^+]=\sqrt{K_ac} $$

3.三乙醇胺是弱碱。

$$ p[H^+]=14-1/2(pK_a+pc)\approx11.38 $$

4.过氧化氢是一元弱酸。

$$ K_a=1.8\times10^{-12},K_ac/K_w=1.8<10,K_w不能忽略;c/K_a>10^{10},c相比[H^+]大。则: \\ \ p[H^+]=p\sqrt{K_ac+Kw}\approx6.78 $$

$0.20mol/L\ H_3PO_4溶液$

是三元弱酸。

1.第一种省略$2K_{a2}/\sqrt{K_{a1}c}<0.1$

$$ [H^+]=[H_2PO_4^-]+2[HPO_4^{2-}]+3[PO_4^{3-}]+[OH^-]\\ =[H_3PO_4]K_{a1}/[H^+]+2[H_3PO_4]K_{a1}K_{a2}/[H^+]^2+3[H_3PO_4]K_{a1}K_{a2}K_{a3}/[H^+]^3+K_w/[H^+]\\ \Rightarrow[H^+]=\sqrt{K_{a1}[H_3PO_4](1+2K_{a2}/[H^+]+3K_{a2}K_{a3}/[H^+]^2)+K_w}\\ \ [H^+]\approx\sqrt{K_{a1}c},当2K_{a2}/[H^+]\approx2K_{a2}/\sqrt{K_{a1}c}<0.1时,这项相对1可以忽略,且其他级解离常数可以忽略了。\\ K_{a1}=7.6\times10^{-3},K_{a2}=6.3\times10^{-8},2K_{a2}/\sqrt{K_{a1}c}<10^{-5},[H^+]\approx\sqrt{K_{a1}[H_3PO_4]+K_w} $$

2.第二种$K_{a1}c/K_w>10$

$$ K_{a1}c/K_w>10^{11},[H^+]=\sqrt{K_{a1}[H_3PO_4]} $$

3.第三种$c/K_{a1}>100$

$$ c/K_{a1}=26<100,不能忽略。\\ \ [H^+]=\frac{-K_a+\sqrt{K_a^2+4K_ac}}{2},pH\approx1.45 $$

4,迭代法,在平衡浓度不能约等于分析浓度时,可以先用分析浓度代替平衡浓度求出$[H^+]$,再通过$[H^+]$求平衡浓度,再通过平衡浓度求二级近似酸度。(在有计算器的情况下可以直接把平衡浓度拆分成$c\delta$)

$$ 迭代方程x=\sqrt[3]{\frac{2K_{a1}K_{a2}}{1-cK_{a1}/(K_{a1}+x)}} $$

$0.10mol/L\ H_2SO_4溶液$

第一解离是完全的,第二解离是不完全的。

1.第一种忽略$4K_ac/K_w>10$

$$ PBE:[H^+]=[HSO_4^-]+2[SO_4^{2-}]+[OH^-]=[HSO_4^-]+2K_a[HSO4^-]/[H^+]+K_w/[H^+]\\ \Rightarrow[H^+]^2=[HSO_4^-][H^+]+2K_a[HSO_4^-]+K_w\\ MBE(忽略水解离的H):2c_{H_2SO_4}=[H^+]+[HSO_4^-]\Rightarrow[HSO_4^-]=2c-[H^+]\\ \Rightarrow[H^+]^2=(2c-2K_a)[H^+]-[H^+]^2+4K_ac+K_w\Rightarrow[H^+]^2-(c-K_a)[H^+]-(2K_ac+K_w/2)=0\\ \ [H^+]=\frac{(c-K_a)+\sqrt{(c-K_a)^2+8K_ac+2K_w}}{2},4K_ac/K_w>10^{11},忽略K_w。\\ \ [H^+]\approx\frac{(c-K_a)+\sqrt{(c-K_a)^2+8K_ac}}{2},pH\approx0.96 $$

2.看成是弱酸在强酸中电离

$$ \begin{align*} HSO_4^- & \quad\longrightarrow & H^+ & \quad+ & SO_4^{2-} \\ c & & c & & 0 \\ c-x & & c+x & & x \end{align*}\\ K_a=(c+x)x/(c-x),x=\frac{-(c+K_a)+\sqrt{(c+K_a)^2+4K_ac}}{2}\approx8.6\times10^{-3}\\ \ [H^+]=0.1086mol/L,pH\approx0.96 $$

$0.050mol/L\ K_2HPO_4溶液、0.050mol/L\ 氨基乙酸溶液和0.10mol/L\ NH_4CN溶液$

是酸式盐。首先只考虑其一级质子化和解离。(多级的累积平衡常数会极小)

$$ [H^+]+[H_2PO_4^-]=[OH^-]+[PO_4^{3-}]\\ =[H^+]+[HPO_4^-][H^+]/K_{a2}=K_w/[H^+]+K_{a3}[HPO_4^-]/[H^+]\\ \Rightarrow[H^+]=\sqrt{\frac{K_{a2}(K_{a3}[HPO_4^-]+K_w)}{K_{a2}+[HPO_4^-]}}\\ 酸式盐在两级平衡常数相差较大时,溶液主要以初始型体为优势型体(参考\delta-pH曲线),[HPO_4^-]=c。\\ \ [H^+]=\sqrt{\frac{K_{a2}(K_{a3}c+K_w)}{K_{a2}+c}} $$

2.第一种忽略$K_{a3}c/K_w>10$

$$ K_{a2}=6.3\times10^{-8},K_{a3}=4.4\times10^{-13},K_{a3}c/K_w=2.2<10,K_w不能忽略。\\ \ [H^+]=\sqrt{\frac{K_{a2}(K_{a3}c+K_w)}{K_{a2}+c}} $$

3.第二种忽略$c/K_{a2}>10$

$$ c/K_{a2}>10^{-6},K_{a2}可以忽略。\\ \ [H^+]=\sqrt{\frac{K_{a2}(K_{a3}c+K_w)}{c}},pH\approx9.70\\ 若第一种忽略成立,则[H^+]=\sqrt{K_{a2}K_{a3}} $$

4.氨基乙酸在溶液中初始型体应为$NH_3^+CH_2COO^-$。

$$ K_{a1}=4.5\times10^{-3},K_{a2}=2.5\times10^{-10}\\ \ [H^+]=\sqrt{\frac{K_{a1}(K_{a2}c+K_w)}{K_{a1}+c}},K_{a2}c/K_w=1250>10,可以忽略K_w;c/K_{a1}=11>10,可以忽略K_{a1}。\\ \ [H^+]=\sqrt{K_{a1}K_{a2}},pH\approx5.97 $$

5.$NH_4CN$是一元弱酸弱碱盐,取碱的质子化常数的倒数为更低级的解离常数。

$$ [H^+]=\sqrt{\frac{K_{aHCN}(K_{aNH_4^+}c+K_w)}{K_{aHCN}+c}},K_{aHCN}=6.2\times10^{-10},K_{aNH_4^+}=5.6\times10^{-10}\\ K_{aNH_4^+}c/K_w=5600>10,K_w可以忽略;c/K_{aHCN}>10^9,K_{aHCN}可以忽略。\\ \ [H^+]=\sqrt{K_{aHCN}K_{aNH_4^+}},pH\approx9.23 $$

$0.050mol/L\ CH_3CH_2NH_3Cl和0.050mol/L\ NH_4Cl的混合溶液$

是弱酸与弱酸的混合溶液。

1.第一种忽略$c/K_a>100$

$$ [H^+]=[A^-]+[B^-]+[OH^-],由于溶液呈酸性,忽略[OH^-]\\ \ [H^+]=\sqrt{K_{HA}[HA]+K_{HB}[HB]}\\ 当两种酸都满足c/K_a>100时,[HA]=c_{HA},[HB]=c_{HB}。\\ \ [H^+]=\sqrt{K_{HA}c_{HA}+K_{HB}c_{HB}}\\ K_{HA}=1.8\times10^{-11},K_{HB}=5.6\times10^{-10},pH\approx5.27 $$

在不能化简时,往往使用迭代法以$[H^+]=\sqrt{K_{HA}[HA]+K_{HB}[HB]}$计算。

2.第二种$K_{HA}c_{HA}\gg K_{HB}c_{HB}$

$$ 当有一酸满足K_{HA}c_{HA}\gg K_{HB}c_{HB},则可化简为[H^+]=\sqrt{K_{HA}c_{HA}} $$

$0.060mol/L\ HCl和0.050mol/L\ ClCH_2COONa溶液$

强酸和弱碱的混合。

看成弱碱在强酸中质子化,即使使用平衡式也要利用变化量。

$$ \begin{align*} ClCH_2COO^- & \quad+ & H^+ & \quad\longrightarrow & ClCH_2COOH \\ 0.05 & & 0.06 & & 0 \\ 0.05-x & & 0.06-x & &x \end{align*}\\

(0.05-x)(0.06-x)/x=1.4\times10^{-3}=K_a\ x\approx0.0455,[H^+]=0.0145,pH=1.84 $$

使用原有的系统环境进行旧则的联机尝试

  • 使用的软件

    某网站的绯想天和则。 RadminLAN。

  • 操作步骤

    1. 用RadminLAN将两台机子连接到同一个局域网。

    2. 在要创建房间的电脑上选择VS Network的第一个选项,选择要使用的端口号(默认10080),创建房间。

    ze1.png

    1. 命令行中使用ipconfig或者复制radminlan上的ip地址,和端口号一起发给另一台设备。

    2. 在要加入对战的设备选择“从剪贴板……”的选项,确保剪贴板上有目标ip:端口号,加入房间对战。

    ze2.png

    1. 注意在两台设备上要允许radminlan和则访问网络。如果不确认是否能连接可以在命令行中输入ping+目标ip进行测试。!

CMake+Vcpkg

前面连接的都还是单一库文件或者头文件,而当前流行的是第三方库包的形式(package)。用Vcpkg管理第三方库包,再在CMakeLists.txt中调用find_package(),这就可以从被指定的路径中找到包的.cmake脚本,从而完成大型第三方库的导入。

vcpkg

在使用这种组合时,不需要用vcpkg new --application来创建,但是也可以这样做。主要利用的是vcpkg的包文件,所以要添加CMAKE_TOOLCHAIN_FILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake,链接到vcpkg工具库。

在vscode中,可以在“运行并显示命令”中使用cmake:select a kit选择要使用的编译工具,在cmake:open cmake tools extension settings的configure args中添加配置时要传递给cmake的参数,相当于-D...标记。

find_package()

find_package(Eigen3 REQUIRED)
#之后可以使用${Eigen3_DIR}、${Eigen3_INCLUDE_DIR}

是查找库这一步最主要的函数。它从vcpkg的文件夹中查找库的.cmake文件。

C:\src\vcpkg\installed\x64-windows

这个路径是集中了include、shared等用于链接的重要文件的路径。

CMAKE_PREFIX_PATH

这个路径指定了寻找各种文件的路径,这里主要取它作为<...>Config.cmake父目录的性质。

设置该路径为上一步的路径,则find_<...>()系列函数都可以从该路径出找到目标文件。

cmake_minimum_required (VERSION 3.10)
project (Transformation)

set(CMAKE_PREFIX_PATH "C:/src/vcpkg/installed/x64-windows")

find_package(Eigen3 REQUIRED)

message(${EIGEN3_INCLUDE_DIR})
message(${CMAKE_PREFIX_PATH})
message(${Eigen3_DIR})


add_executable (Transformation main.cpp)

target_link_libraries(Transformation Eigen3::Eigen)

使用包

可以直接使用target_link_libraries()将包的名字空间连接到其他目标文件。

由于可能环境会莫名奇妙的修改你的CMAKE_PREFIX_PATH,请在CMakeLists.txt中显式定义它。

参考文献

[1]CMAKE_PREFIX_PATH — CMake 3.31.0-rc3 Documentation

[2][CmakeList][转载]Could not find a package configuration file provided by “Opencv“-CSDN博客

链接动态库

  • 动态库源文件编写

  • add_libraries(库名 SHARED 源文件)

  • add_executable(可执行文件名 源文件)

  • 链接库到可执行文件,target_link_libraries(可执行文件名 库名)

脚本语言有顺序需求,如果在link前没有两个目标文件被创建,cmake的编译将出错。(即cmake .出错。)

.
├── CMakeLists.txt
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── Makefile
│   ├── cmake_install.cmake
│   ├── compile_commands.json
│   ├── hello.exe
│   ├── libmymath.dll
│   └── libmymath.dll.a
├── main.cpp
├── mymath.cpp
└── mymath.hpp

附件:

cmake+dll+ANSI转义.zip

参考文献: [1]【技能分享】为C语言控制台终端启用彩色支持(无需第三方软件) [2]Step 2: Adding a Library — CMake 3.31.0-rc2 Documentation

2024/09/12

编译dll

在项目属性中选择动态链接库,就可以将源文件转为dll。

要为dll对外提供函数接口,需要在函数声明中使用__declspec(dllimport)。

#define DLL __declspec(dllimport)


extern "C" DLL returntype function(arguements);


returntype function(arguements){
...
}

注意声明后不能定义。在dll中返回对象将只有地址,非常危险。

在python中使用dll

ctypes模块提供了C类型到Python类型的转换,以及使用dll中函数的接口。

import ctypes as ct;
import random;

rd=ct.cdll.LoadLibrary('./Project1.dll')
rd.randout()

with open("out.txt","r+") as out:
    li = out.readline().split(' ')
    random.shuffle(li)
    body = ' '.join(li)

with open('out2.txt','w+') as out:
    out.write('1000\n'+body)



2024/10/04

Fusion 360体验

草图理念

以最简单的单视图设计为例,零件为一个平面图形的拉伸。

这句话包含平面图形拉伸两个重要概念。零件——三维物体(模型),平面图形——草图,拉伸——创建、构造操作。

工作流程为:

  1. 绘制好草图

  2. 以草图为基础利用构造操作制造三维模型

于是,三维结构的特征就通过草图决定。

为了便于修改与表示草图元素之间的关联,提供了约束操作,可以指定线段平行、垂直等。

基础的拉伸操作有两种,为面拉伸、薄拉伸。


2024/10/24

C++程序设计

在vsc中添加c++扩展,在计算机中安装gcc,在命令行中使用gcc来编译.cpp源文件到.exe可执行文件。

gcc test.cpp -o debug/test.exe

-o指定目标文件名称,-Wall指定输出所有错误。

编译多文件,头文件会在当前目录下或系统头文件库寻找。第三方库不确定怎么用。

gcc main.cpp hello.cpp -o helloworld

但是vsc的内部终端不能浏览文件,所有要使用cmd或powershell来编译多文件。

可以独立编译各文件为.o,再编译成可执行文件。

g++ -Wall -c main.cpp hello.cpp
g++ main.o hello.o -o hw

对于windows,标准库的调用不需要显式链接。

要实现预处理,使用-D NAME=VALUE

g++ -DTEST=10 main.cpp hello.cpp -o debug/hw

以上在windows系统中有差错是,编译生成的文件一般用.obj。

文件分别生成.obj再链接的原因是,如果一直使用源码编译链接,每次都需要编译所有文件,在大型工程上是不利的。当全部.obj已经生成,那修改了的.cpp只需要再次编译替换原来的.obj即可。

库的打包与使用

见命令行工作。

gcc/g++还可以通过生成并使用.out文件来完成性能探查。

没有找到makefile的学习资料,不同厂商的makefile用法不同。

CMake+Visual Studio Code

安装CMake、C/C++扩展。

CMake使用有基本的三步:

  • 指定CMake最低版本。

  • 指定项目名称。

  • 指定可执行文件名和源文件。

CMakeLists.txt中。

cmake_minimum_required(VERSION 3.30)
project(HelloWorld)

add_executable(helloworld helloworld.cpp)

然后在命令行中使用cmake 路径cmake --build 路径

分别在路径位置查找CMakeLists.txtCMakeCache.txt,再在命令行所在位置生成编译、链接文件。

根据选择编译的模式不同,会使用不同的方法(编译器)编译,生成不同的中间文件。

这里默认应该是MVSC,虽然会多生成很多奇怪东西但是还可以不用组织目录。

cmake ./
cmake --build ./

d10c8bb2-21b8-4d4d-8bdd-17d4b626ad2c.png

如果要组织目录,首先将源文件、头文件和CMakeLists.txt放在一个目录source中,

cmake ./source
cmake --build ./

7bd08fd2-72e2-4818-9b16-ca7758bfdc67.png

C++标准版本

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

切换编译器

mvsc的生成内容很多,希望使用mingw32-make编译,则在第一次使用cmake是加-G。

cmake -G "MinGW Makefiles" .

此时注意所有生成文件都默认在同目录下,生成的链接库会自动添加libXX.a,在要链接时只要填入XX。

link_library(greeting)

变量

cmake中有一系列变量,如PROJECT_SOURCE_DIRPROJECT_BINARY_DIR,分别表示顶层CMakeLIsts.txt所在目录、cmake生成目录。

在使用时用${PROJECT_SOURCE_DIR},可以用message命令来传出变量值。

message(STATUS "PROJECT_SOURCE_DIR:${PROJECT_SOURCE_DIR}")

链接库

多源文件的情况:

4a816a4f-6d49-4032-8ab2-39ebb185875a.png

要生成静态库,使用add_library(),用法与add_executable()相同。

库中的函数在头文件中声明,外部变量在源文件中定义,而头文件中用extern声明外部变量,其他源文件只要包含该头即可。

要使用静态库,要添加静态库的目录位置到项目,使用link_library()link_directories()

注意生成静态库时,如果有同名文件,它并不会覆盖!所以要求先删去。g++、cmake编译出的lib不一定能互用。

target_link_libraries()target_include_directories()提供与上面类似的方法,但是可以指定要链接静态库目标的可执行目标。该方法必须放在可执行目标已经被add_executable()生成之后。target_include_directories()向目标添加寻找头文件的目录(有库的情况下相当于指定使用的库,库在前面已经指定)

add_library(greeting greeting.cpp)
add_executable(helloworld helloworld.cpp)

target_link_libraries(helloworld PUBLIC greeting)