Matlab 曲线拟合不适用于小值(1e-12),我该怎么办?

2024-01-11

我安装了曲线拟合工具箱,并且正在尝试将扩散数据拟合到特定函数。

该函数是以下形式的误差函数:

y = 3500 - 2500 * erf( ( x-x0 ) / ( 2 * sqrt( D * t )) )

我希望该应用程序为我提供合理的值D and x0,而 t 是预定义的常数。拟合所基于的数据点包括 x 和 y 的值。

我知道D 应该在 1e-11 左右 and x0 约为 0.0014但该函数不会自行找到这些解决方案。 Matlab 输出错误“输入内容必须真实、完整。“尝试使用曲线拟合应用程序的默认参数时。 当我设定起始猜测时x0到0.0014或0.0015,它会找到正确的解决方案。但仅限于这两个值。为了找到正确的解决方案D我需要在方程中设置一个前置因子,如本例所示(1e-12):

y = erf( ( x-x0 ) / ( 2 * sqrt( 1e-12 * D * t )) )

通过这种方式,matlab 可以找到正确的解,但仅限于 1e-10 到 1e-13 之间的前置因子。

这是一个很大的问题,因为 D 的正确解决方案将在 1e-3 和 1e-15 之间变化,具体取决于我要使用的数据集。 x0 的值也会变化。所以这样我就无法实现一个通用的解决方案。

您对如何处理这个问题有什么建议吗?我不敢相信matlab无法解决这个问题,一定有办法。是因为数值太小了吗?

这是我正在使用的示例数据集:

y = [6000 6000 6000 6000 6000 6000 6000 6000 6000 5750 5500 5250 5000 4500 4000 3250 2750 2250 1750 1500 1400 1250 1250 1150];
x = [0:0.0001:0.0023];

当在方程中使用以下固定参数时,所得直线非常适合数据点。但 matlab 不会找到它们。

D = 7.1e-11;
t = 900;
x0 = 0.0015;

(请记住,这些参数基于比我在这里提供的数据集更大、更准确的数据集)

任何帮助都会很棒!非常感谢。

这是一个工作示例,其中包含所有预定义参数以使拟合工作。代码由曲线拟合工具 (cftool) 生成:

%% Fit: 'untitled fit 1'.

   % Input data
    C = [6000 6000 6000 6000 6000 6000 6000 6000 6000 5750 5500 5250 5000 4500 4000 3250 2750 2250 1750 1500 1400 1250 1250 1150]';
    x = [0:0.0001:0.0023]';

    [xData, yData] = prepareCurveData( x, C );

    % Set up fittype and options.
    ft = fittype( '3500-2500*erf((x-x0)/(2*sqrt(1e-10*D*900)))', 'independent', 'x', 'dependent', 'y' );
    opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
    opts.Display = 'Off';
    opts.MaxIter = 4000;
    opts.StartPoint = [0.5 0.0014];
    opts.Upper = [1 Inf];

    % Fit model to data.
    [fitresult, gof] = fit( xData, yData, ft, opts )

    % Plot fit with data.
    figure( 'Name', 'untitled fit 1' );
    h = plot( fitresult, xData, yData );
    legend( h, 'C vs. x', 'untitled fit 1', 'Location', 'NorthEast' );
    % Label axes
    xlabel x
    ylabel C
    grid on

(图只是为了方便)

请注意,我在 sqrt() 项中包含了前置因子 1e-10,并且我使用 0.0014 作为 x0 的起始猜测,否则拟合将不起作用。


似乎有两个问题:

  1. 您的函数并未针对每个实际值进行定义。假设您只对正值感兴趣D and x0,您可以通过将下限指定为简单地将搜索范围限制为正数[0 0]

  2. 由于值非常小,Matlab 在数值计算函数导数时存在问题。因此,最好的解决方案是以符号方式计算函数的雅可比矩阵。这可以使用符号工具箱来完成:

    syms x x0 D t real;
    
    y = 3500 - 2500 * erf( ( x-x0 ) / ( 2 * sqrt( D * t )) )
    J = jacobian(y, [D, x0]);
    

    您可以使用matlabFunction https://mathworks.com/help/symbolic/matlabfunction.html将其转换为普通的 matlab 函数,或者只是将结果复制并粘贴到脚本中,这样您就不必在每次迭代中以符号方式计算雅可比。

    您应该设置该选项'SpecifyObjectiveGradient',true https://mathworks.com/help/optim/ug/lsqcurvefit.html#input_argument_d0e68725告诉 matlab 使用你的精确雅可比矩阵。


实现这两个解决方案会产生以下代码:

ydata = [6000 6000 6000 6000 6000 6000 6000 6000 6000 5750 5500 5250 5000 4500 4000 3250 2750 2250 1750 1500 1400 1250 1250 1150];
xdata = 0:0.0001:0.0023;
t = 900;

D = 0.1;
x0 = 0.1;

options = optimoptions('lsqcurvefit', 'SpecifyObjectiveGradient',true);
X = lsqcurvefit(@(x, xdata) y(x(1), x(2), t, xdata),[D, x0], xdata, ydata, [0 0], [], options);

D = X(1); % 6.4833e-11
x0 = X(2); % 0.0015

figure
hold on
plot(xdata, ydata);
plot(xdata, y(D, x0, t, xdata));

function [F, J] = y(D, x0, t, x)
  F = 3500 - 2500 * erf( ( x-x0 ) / ( 2 * sqrt( D * t )) );
  J =  [(1250.*t.*exp(-(x - x0).^2/(4.*D.*t)).*(x - x0))/(pi^(1/2).*conj((D.*t).^(3/2))); ...
            (2500.*exp(-(x - x0).^2/(4.*D.*t)))/(pi.^(1/2).*conj((D.*t).^(1/2)))]';
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab 曲线拟合不适用于小值(1e-12),我该怎么办? 的相关文章

  • python 正弦和余弦精度

    如何提高Python正弦和余弦精度 例如 我想使用以下代码 只需计算随机复向量 x 的 y cos acos x import numpy as np N 100000 x np zeros N 1j np zeros N for k in
  • 在 Matlab 中显示有理数

    我有两个整数 m n 它们一起形成 m n 形式的有理数 现在我只想以这种理性的形式在 Matlab 中显示它们 我可以通过这样做来做到这一点 char sym m n 所以 如果 例如m 1 n 2 Matlab将显示1 2 然而 如果m
  • 为什么 MATLAB 本机函数 cov(协方差矩阵计算)使用与我预期不同的除数?

    给定一个 M 维和 N 个样本的数据矩阵数据 例如 data randn N M 我可以计算协方差矩阵 data mu data ones N 1 mean data cov matrix data mu data mu N 如果我使用原生
  • 如何加载具有可变文件名的 .mat 文件?

    select all mat files oar dir oar mat n oar name loop through files for l 1 length oar load pat oar l lt this is the mat
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • Matlab颜色检测

    我试图一致地检测同一场景的图像之间的某种颜色 这个想法是根据颜色配置文件识别一组对象 因此 例如 如果给我一个带有绿色球的场景 并且我选择绿色作为我的调色板的一部分 我想要一个具有反映它检测到球的矩阵的函数 任何人都可以为这个项目推荐一些
  • 如何为已编译的 MATLAB 创建安装程序并要求用户接受我们的许可条款?

    我正在 MATLAB 中编写程序分发给 Windows 用户 我使用 MATLAB 编译器和 MATLAB r2014a 版本来创建程序 我可以使用 MATLAB 应用程序编译器创建 Windows 安装程序 并且它的工作效果可以接受 但是
  • 直方图均衡结果

    I am trying to code histogram equalization by my self but the results are different from the built in function in matlab
  • 在 Matlab 的命令窗口中获取旧式帮助

    问题的简短版本 在最新版本的 Matlab 中 我在 Windows 上的 R2014b 和 R2015a 中看到过 当您键入help foo你得到一个简要描述 简介函数及其签名 例如 输入help bsxfun产生类似这样的东西 只有更好
  • 如何在Matlab中绘制网络?

    我有一个矩阵AMatlab中的维数mx2每行包含两个节点的标签 显示网络中的直接链接 例如 如果网络有4矩阵的节点A可能A 1 2 1 3 2 1 2 4 3 2 4 1 4 2 其中第一行表示有一个链接来自1 to 2 第二行表示有一个链
  • 如何使用Matlab将数据保存到Excel表格中?

    我想将数据以表格形式保存在 Excel 工作表中 它应该看起来像 Name Age R no Gpa Adnan 24 18 3 55 Ahmad 22 12 3 44 Usman 23 22 3 00 每次当我执行我的文件时类数据 m 下
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 我如何编写一个名为 dedbi 的 MATLAB 函数,它将输入 xtx 作为字符串并返回另一个字符串 xtxx 作为输出。

    dedbi 反转单词 即 a 将被 z 替换 b 将被 y 替换 c 将被 x 替换 依此类推 dedbi 将对大写字母执行相同的操作 即将字符串 A 替换为 Z 将 B 替换为 Y 将 C 替换为 X 依此类推 如果我给函数这个字符串 a
  • Matlab:条形图中缺少标签

    使用 Matlab 2012 和 2013 我发现设置XTickLabel on a bar图表最多只能使用 15 个柱 如果条形较多 则标签会丢失 如下所示 绘制 15 个条形图 N 15 x 1 N labels num2str x d
  • matlab中无限while嵌套在for循环中

    我想做一个while循环 嵌套在for在 Matlab 中循环以查找数据中不同对之间的距离 我的数据具有以下形式 ID lon lat time 1 33 56 40 89 803 2 32 45 41 03 803 3 35 78 39
  • Ilnumerics Ilpanel 在 winform 中编译成 dll 并加载到 matlab 时不激活

    我想将 Visual studio 2012 中用 C 编写的 winform 编译为 dll 然后将其加载到 matlab 2013a 中 然后 我想使用 matlab net 接口与 winform 进行交互 侦听其事件并通过一组预定义
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看
  • MATLAB 除法...29/128 应该返回 0 吗?

    我真的不认为这是一个精度问题 答案应该是0 226左右 这是确切的代码 val I i j bucketSize pos val bucketSize I只是我从中获取值的矩阵 以下是 MATLAB 的输出 val 29 bucketSiz

随机推荐

  • BigQuery 获取唯一行

    我有这些行 我想知道如何仅获取按 id unit number 序列号和驱动程序分组的唯一行 但同时获取该行的日期 SELECT id date FROM table GROUP BY id date ORDER BY id date DE
  • 面向消息的协议与面向流的协议之间的区别[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我试图理解之间的区别message oriented and stream oriented协议 我四处搜寻 没有发现两者之间的明确解释或
  • 在控制器内使用警报脚本后返回视图

    这是出于对在 C 代码中管理 JavaScript 的兴趣而提出的问题 而不是讨论这是否是一个好的设计 我开始尝试使用控制器内创建警报这个答案 https stackoverflow com questions 38168512 retur
  • 最大周期子串的正则表达式

    这是后续用于检测周期性字符串的正则表达式 https stackoverflow com questions 38322973 a regex to detect periodic strings noredirect 1 comment6
  • elm 0.19.1 中的当前年份为 4 位数字

    如何使用 ELM 0 19 1 执行一个函数来获取 4 位数字的当前年份 我读过一些内容 但 0 19 1 没有任何效果 签名 getCurrentYear Int 执行 getCurrentYear gt 2020 Edit 也许正在执行
  • 类型错误:__init__() 得到意外的关键字参数“方法”

    好吧 我正在编写一个 Flask 项目 但是当我尝试python manage py 回溯告诉我 Traceback most recent call last File manage py line 5 in
  • 使用 gradle (Android Studio) 和本地 Maven 存储库时无法构建应用程序

    我正在尝试包括图书馆Slik https github com afollestad Silk and Cards UI https github com afollestad Cards UI在我的应用程序中 我使用 android st
  • 将嵌套对象列表非规范化/展平为点分隔的键值对

    如果我的嵌套对象是字典 那就更简单了 但这些是字典列表 例子 all objs1 a 1 b ba 2 bb 3 ba 21 bb 31 c 4 a 11 b ba 22 bb 33 bc h 1 e 2 c 44 我期望以下格式的输出 a
  • 我可以在 UITableviewCell 中使用 viewDidLoad 方法吗?

    我可以用吗viewDidLoad中的方法UITableviewCell 不 你不会在自定义单元类子类 UITableViewCell 中编写 viewDidLoad 它是 UIViewController 的一部分 你有一个名为的方法 vo
  • Chrome 在 z 索引方面是否正在退化(或者我做错了什么)?

    我正在制作的网站的导航作为 3 个选项卡 单击后将显示 3 个相应的内容 我刚刚意识到它不起作用铬22 虽然我 90 确定一年前网站上线时我在 Chrome 上测试过它 但在IE9 and FF16 这是我的问题的摘要 http jsfid
  • 设置android操作栏的背景颜色

    我正在使用兼容性库 v7 进行操作 我只是想将操作栏的颜色 适用于 Android 2 1 及更高版本 尽管我运行 Android 4 4 2 设置为纯色 但颜色不会改变 它保持不变 我也尝试过用颜色创建一个实体可绘制对象 但这也没有改变
  • 使用 libtool 从共享库加载重复的函数名

    我正在尝试创建一个 调试 共享库 即 so 或 dll 文件 该库调用另一个具有与调试库相同的 C API 的 真实 共享库 在本例中 是为了模拟 PKCS 11 API 但是 我遇到了麻烦 调试库的链接映射与真实库的链接映射发生冲突 导致
  • 如何让玩家在路径中移动到另一侧?

    我希望当触摸开始时 玩家 红色圆圈 移动到圆形路径的另一侧 我已经让玩家遵循一条路径 但我还没有在互联网上找到我的问题的答案 override func didMoveToView view SKView player SKSpriteNo
  • 在 Windows 上安装 R Studio 服务器

    是否可以在 Windows 计算机上安装 RStudio Server 我知道如果我使用AMI就可以 但是如果没有AMI我怎么安装它呢 我读过http www r bloggers com rstudio server part 2 pro
  • COM+ 库应用程序的目的是什么?

    创建 COM 应用程序时 向导会提供在库应用程序和服务器应用程序之间进行选择的选项 服务器应用程序在单独的进程中激活 这可用于以廉价的方式将 64 位使用者与 32 位进程内 COM 组件进行互操作 在调用者进程中激活的库应用程序有什么用
  • 聚合的意外输出

    在尝试时aggregate另一个问题here https stackoverflow com questions 14434632 find frequency of each unique column in a matrix or da
  • NLTK 将标记化句子转换为同义词集格式

    我希望使用 NLTK 获得单个单词和句子中每个单词之间的相似性 NLTK可以得到两个特定单词之间的相似度 如下所示 此方法要求给出对该单词的具体引用 在本例中为 dog n 01 其中狗是名词 我们希望使用第一个 01 NLTK 定义 do
  • 您是否需要创建一个分支来检查特定的 git 修订版?

    我想做的一个常见的事情是将我的工作副本恢复到特定修订版 进行一些测试 然后将其带回我当前母版的头部 过去我天真地做了一个 git checkout hash 结果却失去了理智 从那以后 我了解到我可以创建一个分支并检查它 切换回来并删除该分
  • Docker Alpine - 启用 GD JPEG 支持

    我在通过 PHP FPM 的 Alpine 图像获取 GD Jpeg 支持时遇到问题 我已经尝试了所有我能想到的组合来使其发挥作用 下面是我的 Dockerfile 的一个片段 FROM php 7 1 fpm alpine RUN apk
  • Matlab 曲线拟合不适用于小值(1e-12),我该怎么办?

    我安装了曲线拟合工具箱 并且正在尝试将扩散数据拟合到特定函数 该函数是以下形式的误差函数 y 3500 2500 erf x x0 2 sqrt D t 我希望该应用程序为我提供合理的值D and x0 而 t 是预定义的常数 拟合所基于的