拟合法-matlab实现

目录

零.基础matlab知识

0.1 基础全局语法

0.2 图像绘制语法

0.3 .

0.4 随机数

一.拟合法的作用

二.拟合法——最小二乘法

2.1 损失函数定义

2.2 最小化损失函数的k,b

​编辑

2.3 评价拟合的好坏

三.拟合法的matlab实现

3.1 计算拟合函数的代码

3.2 计算拟合优度的代码

3.3 强大的曲线拟合工具箱cfool


零.基础matlab知识

具体可查看MATLAB官方帮助文档:

MATLABDocumentation- MathWorks 中国

0.1 基础全局语法

  • clear

clc % 清楚命令窗口的内容,对工作环境无任何影响,只是为了方便后续程序的输出

close % 关闭当前的Figure窗口

clear % 清楚工作空间的所有变量

close all % 关闭所有的Figure窗口

clear all % 清除工作空间的所有变量,函数,和MEX文件

0.2 图像绘制语法

hold on %继续在之前的图形上画图形

grid on %显示网格线

f=@(x)k*x+b; %@()标明自变量

  • fplot()

fplot(f) % 在默认区间 [-5 5](对于 x)绘制由函数 y = f(x) 定义的曲线。

fplot(f,xinterval) % 将在指定区间绘图。将区间指定为 [xmin xmax] 形式的二元素向量。

fplot(funx,funy) % 在默认区间 [-5 5](对于 t)绘制由 x = funx(t) 和 y = funy(t) 定义的曲线。

0.3 .

MATLAB 中用一个特殊的符号来区分矩阵运算和数组运算。在需要区分两者不同的时侯,把点置于符号前来指示这是一个数组运算(例如, .*)。线面给出的是一些常见的数组和矩阵运算。

  1. 数组加法:A+B,数组加法和矩阵加法相同。

  2. 数组减法:A-­B ,数组减法和矩阵减法相同。

  3. 数组乘法:A.*B,A 和 B 的元素逐个对应相乘,两数组之间必须有相同的形,或其中一个是标量。

  4. 矩阵乘法:A*B,A 和 B 的矩阵乘法,A 的列数必须和 B 的行数相同。

  5. 数组右除法:A./B,A 和 B 的元素逐个对应相除:A(i,j)/B(i,j)两数组之间必须有相同的形,或其中一个是标量。

  6. 数组左除法:A.\B,A 和 B 的元素逐个对应相除:B(i,j)/A(i,j)两数组之间必须有相同的形,或其中一个是标量。

  7. 矩阵右除法:A/B 矩阵除法,等价于 A*inv(B), inv(B)是 B 的逆阵。

  8. 矩阵左除法:A\B 矩阵除法,等价于 inv(B)*A, inv(A)是 A 的逆阵。

  9. 数组指数运算:A.^B,AB中的元素逐个进行如下运算:A(i,j)^B(i,j),A(i,j)/B(i,j)两数组之间必须有相同的形,或其中一个是标量。

0.4 随机数

randi():产生均匀分布的随机整数

X = randi(imax,sz1,...,szN) 

% 返回 sz1×...×szN 数组,其中 sz1,...,szN 指示每个维度的大小。

% 例如,randi(10,3,4) 返回一个由介于 1 和 10 之间的伪随机整数组成的 3×4 数组。

rand:产生均匀分布的随机数

X = rand 返回从区间 (0,1) 的均匀分布中得到的随机标量。

X = rand(n) 返回一个由均匀分布的随机数组成的 n×n 矩阵。

normrnd:产生正态分布的随机数

r = normrnd(mu,sigma,sz1,...,szN) 

生成正态随机数数组,其中 sz1,...,szN 指示每个维度的大小。

roundn:任意位位置四舍五入

roundn(x,n) 返回在n位四舍五入的x值

一.拟合法的作用

  • 与插值法相比,拟合法不要求曲线一定经过指定点,不易出现ronge现象。拟合法要求一个具体的尽量简洁的函数,该曲线在某种标准下和所有的数据点最为接近,称为拟合的好。
  • 这种标准为最小化损失函数。
  • 拟合法的突出特点为:达到简约性和准确性的平衡。

二.拟合法——最小二乘法

2.1 损失函数定义

 问题:为什么不用绝对值?三次方?四次方?

  1. 取绝对值时不容易求导最小化损失函数,计算较为复杂。
  2. 避免正负相消。(三次方)
  3. 避免极端数据对拟合函数的影响。(四次方)

2.2 最小化损失函数的k,b

需要注意的是:

  • 求导是对参数的求导,这和线性函数的定义相关。
  • 运用最小二乘法的前提不一定要求拟合函数是线性函数,但我们这里只讲了线性函数的推导。

2.3 评价拟合的好坏

首先是看图像是否经过目标点附近

其次计算SSE,拟合优度等测量指标

 可以证明:SST=SSE+SSR

注意:证明是通过一阶导数条件而得的,故公式只对参数的线性函数成立。

一般而言,SSE越小,拟合程度越好。

对于拟合优度R^{2}

  • 出现的原因:SSE会随着量纲的减小而减小,拟合优度可以用来统一量纲
  • 局限性:由于用到公式SST=SSE+SSR,故只能用于评价线性拟合函数
  • 对于同一组数据,可以用SSE进行判断

三.拟合法的matlab实现

3.1 计算拟合函数的代码

n=size(x,1)
k=(n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x))
b=(sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(n*sum(x.*x)-sum(x)*sum(x))

3.2 计算拟合优度的代码

y_hat=k*x+b;
SSR=sum((y_hat-mean(y)).^2)
SSE=sum((y_hat-y).^2)
SST=sum((y-mean(y)).^2)
R_2=SSR/SST

3.3 强大的曲线拟合工具箱cfool

  • 可以保存图像

文件->print to figure->导出设置->渲染->分辨率

  • 可以保存代码——但需要自行修改代码内出现的名称

文件->Generate Code

  • 有时候拟合的不收敛

也许是因为初始值没有设置好

fit options内修改starting point

  • 脚本中计算预测值(注意这里要写成点乘和点除,这样可以保证按照对应元素进行计算)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
动力学数据拟合Matlab代码可以分为以下几步: 1. 准备数据 准备实验数据,包括时间、浓度等数据,并将其保存为.mat文件。 2. 定义模型 定义动力学模型,并将其保存为函数文件。 3. 设置初始参数 根据模型的参数设置初始参数值。 4. 进行拟合 使用Matlab拟合函数,如lsqcurvefit或fmincon等进行拟合。 5. 绘制结果 绘制拟合结果,并进行分析。 以下是一个简单的动力学数据拟合Matlab代码示例: ```matlab % 准备数据 load('data.mat'); % 定义模型 function y = model(params, t) % params为模型参数 % t为时间序列 k1 = params(1); k2 = params(2); y0 = params(3); y(1) = y0; for i = 2:length(t) y(i) = y(i-1) + k1*y(i-1)*t(i-1) - k2*y(i-1)*t(i-1); end end % 设置初始参数 params0 = [0.1, 0.05, 0.1]; % 进行拟合 params_fit = lsqcurvefit(@model, params0, t, y); % 绘制结果 t_fit = linspace(0, max(t), 100); y_fit = model(params_fit, t_fit); plot(t, y, 'o', t_fit, y_fit, '-') xlabel('时间') ylabel('浓度') legend('实验数据', '拟合结果') ``` 其中,data.mat为实验浓度数据,t为时间序列,y为对应的浓度数据。model函数为动力学模型,params为模型参数,t为时间序列。params0为初始参数值。lsqcurvefit为拟合函数,@model表示使用model函数作为模型进行拟合。params_fit为拟合结果,t_fit为拟合时间序列,y_fit为对应的浓度数据。最后使用plot函数绘制实验数据拟合结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值