资讯动态

SASfit小角散射数据拟合:从散射曲线到可靠结构参数

发布时间:2026/10/18 19:22:57 来源:尧图企业网站定制
简介SASfit是一款面向小角散射数据处理的开源专业程序常用于同步辐射、中子散射等科研场景帮助研究人员分析X射线或中子散射实验数据。它支持计算回转半径、散射不变性、Porod常数等整体结构参数并能基于多种形状因子与结构因子拟合尺寸分布还提供全局拟合算法可同时处理对比变化或极化中子测量中的多条散射曲线从而降低参数相关性、提升拟合可靠性。资源压缩包共208个文件约54.19MB包含so动态库、h头文件、tbl表格数据、gpf图形参数文件、rgb配色文件以及csv/txt示例数据等便于用户从源码构建或直接参考示例开展分析。此外附有PDF指南与bib参考文献能帮助上手操作。目前已有1617人学习下载适合具备小角散射背景并希望借助开源工具进行结构拟合的科研人员与工程师使用。1. 小角度散射数据拟合不玄学SASfit 把结构模型变成可复现的参数小角度散射SAXS/SANS数据的解读一直是材料表征里的“黑匣子”环节拿到一条 I(q) 曲线怎么把它翻译成颗粒半径、尺寸分布和体积分数SASfit 正是一个把这些结构模型落到数值拟合上的开源软件。它内置几十种几何模型与结构因子支持尺寸分布、仪器展宽修正和多种拟合算法不用自己写拟合代码就能把散射曲线收敛到一组物理参数上。适合做胶体、纳米材料、聚合物溶液、生物大分子溶液的研究与检测用户也适合想省掉重复建模工作的一线工程师。2. 拟合原理与模型选型先弄懂 I(q) 曲线在说什么2.1 从散射强度到结构参数SAS 拟合的基本逻辑SAS 实验得到的是散射强度 I(q) 关于散射矢量 q 的曲线q 的定义是 q 4π sin(θ)/λθ 是散射半角λ 是入射波长。q 的物理意义是实空间尺度的倒数q 越大对应的实空间尺寸越小。所以低 q 区反映颗粒的整体尺寸高 q 区反映界面和内部结构。做拟合之前必须建立这个尺度对应关系否则容易在选模型和定拟合范围时把方向搞反。SASfit 拟合的数学基础是I(q) scale · P(q) · S(q) background。P(q) 是形状因子描述单个颗粒的形状和内部结构S(q) 是结构因子描述颗粒之间的相互作用和空间排列scale 是标度因子关联浓度、对比度和仪器因子background 是常数背景来自非相干散射和探测器暗噪声。这个公式是整个拟合的核心。很多人一上来就选模型开始跑结果拟合出来的参数物理上不合理多半是没有先想清楚数据里哪些 q 区间受 P(q) 主导哪些受 S(q) 主导。提示低 q 区出现平台或上升往往意味着体系里有聚集或大尺寸结构高 q 区按 q⁻⁴ 衰减说明颗粒有尖锐界面。这些视觉判断在做模型选型时比 χ² 更靠前。2.2 模型库怎么选球、核壳、圆柱与聚合物的适用边界SASfit 的模型库覆盖了绝大多数小角散射实验会遇到的几何体。我常用的分类如下表模型分类典型模型适用场景关键参数球体均匀球、核壳球球形胶体、包裹型纳米颗粒半径、壳厚、壳层 SLD各向异性体圆柱、碟片、椭球棒状胶束、片层材料长径比、半径、长度聚合物链Debye 链、支化链聚合物溶液、柔性链回旋半径 Rg、链段长度结构因子硬球 S(q)、带电 S(q)高浓度颗粒体系体积分数、有效作用半径选型的基本逻辑是先看低 q 区斜率q⁻¹ 衰减大概率是棒状q⁻² 是高斯链或片层q⁻⁴ 是界明锐的致密颗粒。其次看有没有明显的振荡峰峰位对应的 d 2π/q 如果和颗粒间距吻合就要考虑加结构因子。这里有个容易踩的坑把核壳球模型当成万能模型什么数据都往上套。核壳模型的参数自由度比均匀球大一截拟合的 χ² 当然会更低但如果没有独立的化学组成证据比如已知壳层是某种聚合物拟合出来的壳厚和反差只是一组数学上最优的数值物理意义存疑。选模型的判断依据不是 χ² 最小而是参数能否和独立的表征手段互相印证。2.3 尺寸分布和仪器展宽为什么单分散模型经常拟合不好真实体系几乎不可能是单分散的。SASfit 对尺寸分布提供了多种分布函数选项最常见的是 Schultz 分布和 Gauss 分布。分布参数比如相对宽度 σ/R会显著影响散射曲线在高 q 区的振荡幅度分布宽度越大振荡越平滑。从实验曲线上看如果高 q 区本应有振荡但实际是平滑单调下降通常就是多分散度偏大。仪器展宽resolution smearing是另一个因素。同步辐射和反应堆中子源的光束都有一定波长散布和几何展宽导致实测曲线比理想模型曲线更平滑。SASfit 允许导入实测的波长分布或几何参数来计算展宽核。我的习惯是先在不开展宽的状态下跑通流程确认模型结构没问题再打开展宽修正。两者同时开参数相关性问题会让 Levenberg-Marquardt 算法在参数空间里来回震荡很难判定到底是模型错了还是展宽参数错了。2.4 散射长度密度与反差哪些参数该算哪些参数该拟合散射长度密度SLD决定颗粒和溶剂之间的反差直接进入 P(q) 的表达式。SLD 不是随便设的拟合参数它是可以由化学组成和密度精确计算的物理量。以常见体系为例水的 SLD 由氧和氢的同位素组成决定氘代溶剂和氢溶剂的 SLD 差别巨大这也是中子散射的优势所在。在 SASfit 里SLD 相关参数建议先算后拟合。计算方式是用组成元素的相干散射长度乘数密度累加。算出来的 SLD 填入模型参数后固定不动只让几何参数自由能显著减少参数相关性。只有当样品的化学组成未知或存在溶剂交换时才把 SLD 作为浮动参数并且要意识到此时拟合结果的唯一性会大打折扣。3. 从安装到首次拟合拿一条真实数据跑通全流程3.1 获取与运行环境开源版本的交叉平台支持SASfit 在开源平台发布提供源码包和现成的可执行文件。常见运行环境是 Windows 和 Linux部分版本支持 macOS。如果是在 Linux 服务器上跑批量任务从源码编译需要配套的图形界面开发库和数值库编译时间大约十几分钟日常单条数据拟合直接用现成可执行文件更快。依赖方面源码包通常自带所需的基础库或给出了依赖清单。我一般会在干净的容器或虚拟环境里先编译一次避免和现有的科学计算环境冲突。注意一点不同版本的可执行文件可能需要不同的运行时库版本换机器跑先确认这一点不然会报链接库错误看起来像软件坏了其实是环境不一致。提示如果目标机器没有图形环境比如远程工作站SASfit 的批处理模式仍然可以跑这点我放到第 6 章细说。3.2 数据准备SAS 数据文件的格式要求SASfit 读取最常见的是两列或三列 ASCII 数据第一列 q第二列强度 I(q)第三列可选强度误差 σ(I)。分隔符支持空格或逗号。单位需要自己保持一致q 用 1/Å 或 1/nm 都行但要记得在参数初始化时把模型尺寸单位对应上。一个典型的三列数据文件片段# q (1/A) I(q) (a.u.) sigma 0.00512 2.343e01 0.32 0.00687 1.987e01 0.28 0.00921 1.532e01 0.25 0.01234 1.087e01 0.22 0.01656 7.652e00 0.19 0.02221 5.234e00 0.17说明第一行注释以 # 开头SASfit 会忽略数据按 q 从小到大的顺序排列。误差列不是必须的但强烈建议提供因为它决定了拟合时每个数据点的权重。没有误差列时SASfit 按固定相对误差处理高 q 区噪声大的点会被过度加权拟合结果向高 q 区倾斜。导入时注意两点一是 q 的最小值要足够小一般要求 q_min 对应的实空间尺度大于颗粒尺寸的两倍才捕得到整体尺寸信息二是数据点数不能太少少于 50 个点拟合出的参数置信区间会宽到失去意义。3.3 导入数据与初始化模型参数打开 SASfit 后的操作路径大致是新建工程并导入数据文件在模型列表里选择均匀球作为起始模型设置初始参数。半径初始值怎么给一个实用估法是找到 P(q) 的第一个极小值位置 q₁对于球体 R ≈ 4.5 / q₁。比如 q₁ ≈ 0.09 1/Å那么 R 的初始值给 50 Å 就是合理的。# 初始值估算球体第一个极小约在 q·R ≈ 4.5 q1 0.09 # 从数据曲线读出的第一个极小位置单位 1/Å R_initial 4.5 / q1 # ≈ 50 Å这个估算不是为了精确而是为了让 Levenberg-Marquardt 算法从一个合理起点出发。background 的初值给数据尾部强度的平均值scale 给一个能让模型曲线峰值和实验峰值同量级的值。三个初始值都给对拟合收敛通常只需要几秒给错一个可能要多跑几十次迭代甚至不收敛。3.4 启动拟合与结果解读χ² 不是唯一指标点击 Fitting 按钮后SASfit 会迭代优化参数界面同时显示模型曲线与实验曲线的重叠情况。收敛后先看三件事χ² 值是否合理拟合曲线在低 q 区和高 q 区是否贴合参数误差带是否小于参数本身。如果 χ² 很低但参数误差巨大说明模型参数之间存在强相关比如核壳球的核半径和壳层厚度互相补偿。此时要增加约束或换更简单的模型。拟合完成后导出文本报告里面包含每个参数的最终值、误差和相关系数矩阵。相关系数超过 0.9 的参数对有可疑的相关性超过 0.95 基本可以断定当前数据集支撑不了这么多自由参数。一个新手常忽略的动作是保存拟合会话。SASfit 允许把当前模型、参数和数据状态存成工程文件后续复现或调整都能回到同一起点。我每次拟合到一半都会存一版这相当于拟合过程的后悔药。4. 参数约束与拟合策略让优化器收敛到物理合理的解4.1 固定与浮动参数分组的先后节奏我第一次用这类拟合工具时犯过一个典型错误把所有参数一次性释放让算法自己找。结果它跑了一个多小时参数来回震荡最后停在某组负半径上。后来摸索出来的顺序是先固定形状参数只拟合 scale 和 background收敛后释放半径和尺寸分布保持其余参数固定最后全部释放做整体精修。分层策略的道理很简单scale 和 background 对曲线整体形状的低频分量敏感形状参数对局部振荡敏感两者耦合不强但不代表没有耦合。分层拟合可以降低陷入错误局部极小的概率。SASfit 的参数面板里可以对每个参数设置固定或浮动也可以设置上下边界。我把半径的下边界设为 1 Å上边界按样品预期尺寸加一个量级防止算法在物理不允许的区间里乱转。4.2 q 区间与权重拟合范围决定结论可信度拟合范围不是越宽越好。高 q 区的数据如果来自探测器的边缘往往伴有余弦修正和偏振修正的系统误差这些点的统计误差很小但系统误差很大。由于最小二乘是按统计误差加权的这些“精度高但不准”的点会把拟合往错误方向拉。我的做法是先在全 q 范围拟合一遍然后逐段去掉高 q 尾部 10%20% 的数据点观察关键参数半径、分布宽度是否稳定。如果参数漂移超过拟合误差的三倍说明这段数据对模型有系统性的排斥要检查仪器修正或模型本身的问题。SASfit 支持在导入时设置 q 范围上下限也支持在拟合过程中临时截断数据重新拟合这个操作在做鲁棒性检查时非常实用。低 q 区同理如果低 q 区有来自大尺寸聚集体的强上升信号而你的模型里没有对应的项整个拟合会被这个上升带着跑。此时要么截断低 q 区要么加一个额外的聚集项不要指望 background 参数去吸收这种结构性的偏差。4.3 背景的陷阱常数背景和 Porod 尾巴的区分很多数据的背景不是常数。致密颗粒体系在高 q 区有 Porod 衰减 I(q) ~ q⁻⁴如果叠加了漫散射背景背景项会随 q 缓慢变化。直接把 background 设为常数拟合会把 Porod 尾巴的斜率拟合错。遇到这种情况先把高 q 区的双对数曲线画出来看斜率。如果斜率在 -3.5-4.5 之间按 Porod 行为处理背景值取数据尾部的水平段中位数如果斜率偏离 -4 很多说明界面不是尖锐的或者有内部结构涨落此时再去套核壳模型才有意义不要一上来就怀疑背景参数。背景项还会影响分布参数的拟合。多分散宽度对高 q 区振荡的平滑作用和常数背景对振荡幅度的抬升作用在视觉效果上类似二者之间存在弱相关。所以背景最好先用独立的方法固定比如实测缓冲液背景或探测器暗计数不要和分布宽度同时从初值开始自由拟合。4.4 多模型对比χ² 差多少才算“显著更好”模型对比是个统计决策问题。两个模型都收敛后不能用“χ² 稍微低一点”就武断地选更复杂的那个。更稳的做法是引入约化 χ²χ²_red χ² / (N - p)其中 N 是数据点数p 是自由参数个数。# 模型选择逻辑示意 chi2_red_1 chi2_1 / (N - p1) # 模型1 的约化卡方 chi2_red_2 chi2_2 / (N - p2) # 模型2 的约化卡方 if chi2_red_2 chi2_red_1 * 0.8: adopt_model_2() # 新模型显著更好值得切换 else: keep_model_1() # 保持简单模型避免过拟合这段逻辑说明模型新增的自由参数必须带来至少约 20% 的拟合质量提升才值得采用。实际中我还会加一条铁律换复杂模型后的新参数必须能和独立的实验证据TEM 尺寸、动态光散射粒径、化学组成对得上否则宁可保留简单模型并把残余偏差归因于模型近似。5. 避坑指南拟合不收敛、参数负值和模型误用的六个常见问题5.1 拟合曲线在低 q 区系统性低于数据点现象均匀球模型拟合完低 q 区模型曲线明显低于实验数据残差在低 q 区呈现一致的正偏差。原因最常见的是没开启结构因子 S(q)。当颗粒体积分数超过约 5% 时颗粒间的硬球排斥相互作用会在低 q 区压低散射强度。如果实测数据是高浓度胶体或浓缩蛋白溶液这个效应非常明显单靠 P(q) 无法描述。解决在模型列表里加上硬球结构因子体积分数初始值给 0.1。拟合后如果体积分数被推到 0.5 以上说明模型不匹配需要换成带吸引势的相互作用模型或者检查样品是否发生了聚集。体积分数卡在 0.5 以上还拟合得很差基本可以判定样品状态和假设不符。5.2 半径拟合结果反复出现负值或趋近于 0现象拟合迭代过程中半径参数被推到边界最终给出负值或 1 Å 以下的非物理结果程序有时还会报参数越界警告。原因Levenberg-Marquardt 是局部优化算法它不会自动理解“半径必须为正”这个物理约束。初始值离真实值太远或者尺寸分布参数和半径形成强相关都可能让半径在迭代中走到负区间。解决在参数面板里给半径设置硬边界下界设 1 Å。初始值先用 4.5/q₁ 粗估不要凭空填。把尺寸分布参数先固定在一个经验值比如 0.1等半径稳定后再释放。这两个动作配合负半径出现的概率能降到很低。5.3 拟合完全不收敛参数在两次迭代间剧烈振荡现象迭代计数器一直跑χ² 降不下去参数值在每轮迭代间跳变幅度超过自身一个数量级最后因达到最大迭代次数而中止。原因自由参数过多数据信息量不足以约束全部参数。核壳球同时拟合核半径、壳厚、壳层 SLD、核 SLD、background、scale六个自由度的组合有时确实超出数据能提供的信息。解决把 SLD 相关参数固定为计算值。SLD 是可以根据化学组成和密度精确计算的不该作为自由参数在拟合里乱跑。固定后参数空间维度下降收敛概率大幅提升。如果还是振荡考虑减少模型复杂度先从均匀球开始。5.4 两个模型给出几乎相同的拟合质量但参数意义完全不同现象均匀球和核壳球分别拟合后χ² 几乎相等但前者的半径和后者的核半径相差一倍不知道该信哪个。原因散射数据的傅里叶变换解不唯一这是小角散射方法本身的固有限制。在一定 q 范围内核壳球的散射曲线可以通过调整对比参数逼近均匀球的曲线。解决引入额外约束。去看 TEM 或 DLS 数据把颗粒总尺寸固定为实测值再拟合壳层厚度。SASfit 允许任意参数固定这个功能要充分利用。如果独立的表征数据都没有就在报告里明确写“模型不唯一”不要硬选一个。5.5 高 q 区拟合残差呈现规则的波浪状现象拟合曲线在高 q 区围绕实验点上下波动残差呈现近似正弦的规律性而不是随机散布。原因两种可能一是仪器分辨率修正没开或修正参数不准二是样品多分散度没表征充分。两者在高 q 区的表现相似因为展宽核和多分散分布都对振荡起平滑作用。解决先确认仪器参数波长分布、光阑几何已正确输入打开展宽修正后看残差是否消失。如果残差还在逐步增大尺寸分布宽度。如果宽度被推到 0.5 以上残差还不平那多半是模型形状本身错误比如把核壳棒当核壳球拟合。5.6 拟合报告中的误差远小于重复实验的波动现象单次拟合的误差带很窄但同一样品换一台仪器测试后再拟合参数差出一倍。原因拟合误差只反映统计传播不包含系统误差。仪器标定、样品浓度、背景扣除的差异都会进入结果而这些在单次拟合的协方差矩阵里看不到。解决做重复性测试。至少测两个独立配制的样品拟合后对比参数。如果重复性差优先排查样品制备和背景扣除而不是调拟合参数。这条经验是我在一次对比实验里学到的两个批次的参数差了 30%后来发现是背景液没重新测。6. 批处理与脚本化把重复的结构表征流程固定成流水线拟合单个数据集不算难难的是面对一个系列样品——比如同一体系在不同温度、不同浓度下的几十条曲线——如果每一条都手动点界面、调初始值、导出报告一个下午就没了。SASfit 支持批处理模式把参数模板和数据文件放在一起批量跑。我的做法是先用界面把第一组数据拟合到满意导出该拟合的所有参数作为模板然后写一个批处理脚本对同目录下所有数据文件逐个拟合结果汇总输出。# 批处理拟合示意命令具体参数名以当前版本帮助为准 sasfit -f template_model.prm -d ./data/*.dat -o ./results/说明-f 指定拟合好的参数模板-d 接收一组数据文件通配符-o 指定输出目录。不同版本的参数名可能有变化批量跑之前先执行一次不带参数的帮助命令确认用法。批处理输出是文本报告我用一段 Python 脚本提取关键参数并画趋势图# 从批处理输出中提取半径并绘制趋势 import glob import matplotlib.pyplot as plt files sorted(glob.glob(results/*.txt)) # 示意按报告固定字段名提取实际解析以导出的文本格式为准 radii [extract_param(f, radius) for f in files] plt.errorbar(range(len(files)), radii, fmto) plt.xlabel(sample index) plt.ylabel(radius (A)) plt.savefig(batch_trend.png, dpi150)参数说明extract_param 是示意性的解析函数实际实现要按报告文本里固定的字段名去匹配半径单位是 Å误差棒可以从报告里读出来一并画上。这段脚本固定下来之后任何同类型样品系列都能直接复用。我现在的习惯是每次拟合一套新数据强制自己走一遍“粗估半径、固定背景、分层释放、检查相关系数、做鲁棒性截断测试”的顺序全部通过之后才进批处理。这套流程不是 SASfit 界面里写的是一年多里用一次次不收敛和负半径换来的从那以后拟合质量基本没返过工。希望这篇笔记能帮你在小角散射拟合这条路上少走几步弯路直接拿到能说服审稿人的参数。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑