Matlab 线性拟合、一维、多维度非线性拟合、多项式拟合

这篇具有很好参考价值的文章主要介绍了Matlab 线性拟合、一维、多维度非线性拟合、多项式拟合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、线性拟合

  线性拟合

我随便设定一个函数然后通过解方程计算出对应的系数

假设我的函数原型是

y=a*sin(0.1*x.^2+x)+b* squre(x+1)+c*x+d

clc;
clear;
x=0:0.2:10;
% 我们这里假设 a=3.2 b=0.7  c=5.0 d是一个随机
y=3.2*sin(0.1*x.^2+x)+0.7*sqrt(x+1)+5*x +rand(size(x));
plot(x,y,'*');
hold on ;
y1=sin(0.1*x.^2+x);
y2=sqrt(x+1);
y3=x;
y4=rand(size(x));

X=[y1;y2;y3;y4];%将各自的俩带入
P=X'\y'  % 通过解方程计算出4个系数

yn=P(1)*y1+P(2)*y2+P(3)*y3+P(4)*y4;  % 得到一个新的函数 计算得出的拟合Y的值 
plot(x,yn,'r');
legend('原始数据点','红色曲线拟合值','Location','southoutside','Orientation','horizontal')

matlab 多维拟合,算法,python,人工智能

 拟合系数:

 matlab 多维拟合,算法,python,人工智能

clear;
clc;
close all
t=0:0.001:2*pi;%原函数
YS=sin(t);%基函数
N=21;
Yo=[];
for k=1:N
    Yn=sawtooth(k*(t+pi/2),0.5);
    Yo=[Yo,Yn'];
end
YS=YS';%拟合
a = Yo\YS;
%绘图
figure()
for k=1:N
    clf
    plot(t,Yo(:,1:k)*a(1:k,:),t,YS,'LineWidth',1)
    ylim([-1.3,1.3])
    xlim([0,6.3])
    pause(0.1)
end

二、非线性拟合

利用matlab实现非线性拟合(三维、高维、参数方程)_matlab多元非线性拟合_hyhhyh21的博客-CSDN博客

上面的这位是真正的大佬,我们都是照猫画虎的学习。

1、一维

简单的一维的拟合:

思路: 将非线性-》线性:

eg:

matlab 多维拟合,算法,python,人工智能

 将其两边都取对数

用线性的方式计算出a b 

逆变换 ,画出曲线:

clear 
clc
close all
% 假设函数 为 y=a* exp(-bx)
x=0:0.1:5;
% 我们这里假设 a=2.4  b=1.2
a=2.4;
b=1.2;
y=a*exp(-b*x);%
y=y+1.3*y.*rand(size(y));  % 增加噪声
plot(x,y,'.');
hold on;
%Lg_y=Lg_a+b*(-x)  变成了ax+b 的形式 ,然而我们的最终的目的是通过x 来计算出a 和 b 
% 对等式的两边取对数
lg_y=log(y);

y1=ones(size(x));
y2=-x;

% 同理和上面计算线性的一杨
X=[y1;y2];
P =X'\lg_y'

% 画出拟合后的曲线
a_fit=exp(P(1));
b_fit=P(2);
x2=0:0.01:10;
plot(x2,a_fit*exp(-b_fit*x2),'-','linewidth',1.5,'color','r')


matlab 多维拟合,算法,python,人工智能

Matlab 中的非线性拟合方法

1、fit 方法

fit是最常用,最经典的方法

matlab 多维拟合,算法,python,人工智能

 matlab 多维拟合,算法,python,人工智能

ft = fittype( 'a*x+b*sin(c*x).*exp(d*x)+e', 'independent', 'x', 'dependent', 'y' );; %函数的表达式, 
OP1 = fitoptions( 'Method', 'NonlinearLeastSquares' );% 非线性拟合方法
OP1.StartPoint = 5*rand(1,5);%初始值,越靠近真实值越好
OP1.Lower = [-2, 0, 2, 0, 0];%参数的最小边界
OP1.Upper = [1,  3, 5, 2, 3];%参数的最大边界
%   开始拟合
fitobject = fit(x',y',ft,OP1);
Fit_P=ones(size(P));
Fit_P(1)=fitobject.a;
Fit_P(2)=fitobject.b;
Fit_P(3)=fitobject.c;
Fit_P(4)=fitobject.d;
Fit_P(5)=fitobject.e;

2、nlinfit()函数 Levenberg-Marquard

L-M 非线性迭代
 

% 2 用nlinfit()函数 Levenberg-Marquardt 
% 定义一个函数
Func=@(P,x)( P(1)*x+P(2)*sin(P(3)*x).*exp(P(4)*x)+P(5));% 也就是说定义一个函数模型
OP2 = statset('nlinfit');% 
%  x,y  modelfun是函数模型  beta表示的是初始值 ,我这里写成最进行的那个参数   OP2  拟合的方法
beta=[-0.17 2.1  3.0  0.25  2.0];% 初始值
Fit_P2 = nlinfit(x,y,Func,beta,OP2);
%拟合
fit_y2 = Fit_P2(1)*x1+Fit_P2(2)*sin(Fit_P2(3)*x1).*exp(Fit_P2(4)*x1)+Fit_P2(5);;
subplot(3,2,2)
hold on;
plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
plot(x1,fit_y2,'-','linewidth',1.5,'color','r');
box on
%ylim(y_lim)
title('nlinfit函数')

matlab 多维拟合,算法,python,人工智能

3、信赖域法(trust region reflective)

信赖域法(trust region reflective)是通过Hessian 矩阵,逐步试探邻域内的最小化,来求解问题的。相比较之前的那些雅克比相关的方法,信赖域法会占用更多内存和速度,所以适用于中小规模的矩阵。

matlab 多维拟合,算法,python,人工智能



% 3 信赖区间  IsqNonLin()
func2=@(P)(P(1)*x+P(2)*sin(P(3)*x).*exp(P(4)*x)+P(5)   -y);
% lsqnonlin方法  
% 'Algorithm','trust-region-reflective'  算法是trust-region-reflective
% MaxFunctionEvaluations  MaxFunctionEvaluations可以理解为试探的次数,
%                        比如算法在一个点的四周试探了三个邻近点的值,然后确定下一步要往其中的某个点走,
%                        这个时候FunctionEvaluations对应3次,即试探了3次,而Iteration是一次,即走了一步,完成了一步迭代
% MaxIterations  最大迭代次数
OP3=optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective','MaxFunctionEvaluations',1e4,'MaxIterations',1e3);
%[-2, 0, 2, 0, 0];%参数的最小边界
%[1,  3, 5, 2, 3];%参数的最大边界
lower=[-2, 0, 2, 0, 0];
up=[1,  3, 5, 2, 3];
% 计算出系数
[Fit_P3,~]=lsqnonlin(func2,beta,lower,up,OP3);
fit_y3=Fit_P3(1)*x1+Fit_P3(2)*sin(Fit_P3(3)*x1).*exp(Fit_P3(4)*x1)+Fit_P3(5);
subplot(3,2,3);
hold on
plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
plot(x1,fit_y3,'-','linewidth',1.5,'color','r')
hold off
box on
%ylim(y_lim)
title('lsqnonlin函数');



%4 lsqcurvefit()函数 trust-region-reflective
modelfun2 = @(p,x)(p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5)) ;
OP4=optimoptions('lsqcurvefit','Algorithm','trust-region-reflective','MaxFunctionEvaluations',1e4,'MaxIterations',1e3);
%[-2, 0, 2, 0, 0];%参数的最小边界
%[1,  3, 5, 2, 3];%参数的最大边界
lower=[-2, 0, 2, 0, 0];
up=[1,  3, 5, 2, 3];
% 计算出系数
%[p,~] = lsqcurvefit(modelfun,p0,x,y,[-2,0,2,0,0],[1,3,5,3,3],OP4);
[Fit_P4,~]=lsqcurvefit(modelfun2,beta,x,y,lower,up,OP4);
fit_y4=Fit_P4(1)*x1+Fit_P4(2)*sin(Fit_P4(3)*x1).*exp(Fit_P4(4)*x1)+Fit_P4(5);
subplot(3,2,4);
hold on
plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
plot(x1,fit_y4,'-','linewidth',1.5,'color','r')
hold off
box on
%ylim(y_lim)
title('lsqcurvefit函数');

4、fsolve()函数

默认的算法为trust-region-dogleg,属于信赖域法。

matlab 多维拟合,算法,python,人工智能

5、粒子群法

matlab 多维拟合,算法,python,人工智能

 所有代码:

clear;
close all;
clc;

% 自定义一个非线性的函数 y=a*x+b*sin(c*x).*exp(d*x)+e  那将函数
x = 0:0.05:10;
P=[-0.2 2.4  3.4  0.3 1.7];
y = P(1)*x+P(2)*sin(P(3)*x).*exp(P(4)*x)+P(5);
y=y+0.5*randn(size(x)); % 添加噪声 
figure();
% 1 .fit 函数开始拟合
ft = fittype( 'a*x+b*sin(c*x).*exp(d*x)+e', 'independent', 'x', 'dependent', 'y' );; %函数的表达式, 
OP1 = fitoptions( 'Method', 'NonlinearLeastSquares' );% 非线性拟合方法
%OP1.StartPoint = 5*rand(1,5);%初始值,越靠近真实值越好
OP1.StartPoint = [-0.17 2.1  3.0  0.25  2.0];
OP1.Lower = [-2, 0, 2, 0, 0];%参数的最小边界
OP1.Upper = [1,  3, 5, 2, 3];%参数的最大边界
%   开始拟合
fitobject = fit(x',y',ft,OP1);
Fit_P=ones(size(P));
Fit_P(1)=fitobject.a;
Fit_P(2)=fitobject.b;
Fit_P(3)=fitobject.c;
Fit_P(4)=fitobject.d;
Fit_P(5)=fitobject.e;
%plot(x,y,'.');

% 开始计算拟合后的y 
x1 = 0:0.01:10;
fit_y1 = Fit_P(1)*x1+Fit_P(2)*sin(Fit_P(3)*x1).*exp(Fit_P(4)*x1)+Fit_P(5);
subplot(3,2,1)
hold on
plot(x,y,'LineStyle','none','MarkerSize',10,'Marker','.','color','k');

plot(x1,fit_y1,'-','linewidth',1.5,'color','r');

% 开始计算拟合后的y 
fit_y1 = Fit_P(1)*x+Fit_P(2)*sin(Fit_P(3)*x).*exp(Fit_P(4)*x)+Fit_P(5);
subplot(3,2,1)
plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
plot(x,fit_y1,'-','linewidth',1.5,'color','r');
hold on;
title('经典fit函数');
box on;




% 2 用nlinfit()函数 Levenberg-Marquardt 
% 定义一个函数
Func=@(P,x)( P(1)*x+P(2)*sin(P(3)*x).*exp(P(4)*x)+P(5));% 也就是说定义一个函数模型
OP2 = statset('nlinfit');% 
%  x,y  modelfun是函数模型  beta表示的是初始值 ,我这里写成最进行的那个参数   OP2  拟合的方法
beta=[-0.17 2.1  3.0  0.25  2.0];% 初始值
Fit_P2 = nlinfit(x,y,Func,beta,OP2);
%拟合
fit_y2 = Fit_P2(1)*x1+Fit_P2(2)*sin(Fit_P2(3)*x1).*exp(Fit_P2(4)*x1)+Fit_P2(5);
subplot(3,2,2)
hold on;
plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
plot(x1,fit_y2,'-','linewidth',1.5,'color','r');
box on
%ylim(y_lim)
title('nlinfit函数')




% 3 信赖区间  IsqNonLin()
func2=@(P)(P(1)*x+P(2)*sin(P(3)*x).*exp(P(4)*x)+P(5)   -y);
% lsqnonlin方法  
% 'Algorithm','trust-region-reflective'  算法是trust-region-reflective
% MaxFunctionEvaluations  MaxFunctionEvaluations可以理解为试探的次数,
%                        比如算法在一个点的四周试探了三个邻近点的值,然后确定下一步要往其中的某个点走,
%                        这个时候FunctionEvaluations对应3次,即试探了3次,而Iteration是一次,即走了一步,完成了一步迭代
% MaxIterations  最大迭代次数
OP3=optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective','MaxFunctionEvaluations',1e4,'MaxIterations',1e3);
%[-2, 0, 2, 0, 0];%参数的最小边界
%[1,  3, 5, 2, 3];%参数的最大边界
lower=[-2, 0, 2, 0, 0];
up=[1,  3, 5, 2, 3];
% 计算出系数
[Fit_P3,~]=lsqnonlin(func2,beta,lower,up,OP3);
fit_y3=Fit_P3(1)*x1+Fit_P3(2)*sin(Fit_P3(3)*x1).*exp(Fit_P3(4)*x1)+Fit_P3(5);
subplot(3,2,3);
hold on
plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
plot(x1,fit_y3,'-','linewidth',1.5,'color','r')
hold off
box on
%ylim(y_lim)
title('lsqnonlin函数');



%4 lsqcurvefit()函数 trust-region-reflective
modelfun2 = @(p,x)(p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5)) ;
OP4=optimoptions('lsqcurvefit','Algorithm','trust-region-reflective','MaxFunctionEvaluations',1e4,'MaxIterations',1e3);
%[-2, 0, 2, 0, 0];%参数的最小边界
%[1,  3, 5, 2, 3];%参数的最大边界
lower=[-2, 0, 2, 0, 0];
up=[1,  3, 5, 2, 3];
% 计算出系数
%[p,~] = lsqcurvefit(modelfun,p0,x,y,[-2,0,2,0,0],[1,3,5,3,3],OP4);
[Fit_P4,~]=lsqcurvefit(modelfun2,beta,x,y,lower,up,OP4);
fit_y4=Fit_P4(1)*x1+Fit_P4(2)*sin(Fit_P4(3)*x1).*exp(Fit_P4(4)*x1)+Fit_P4(5);
subplot(3,2,4);
hold on
plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
plot(x1,fit_y4,'-','linewidth',1.5,'color','r')
hold off
box on
%ylim(y_lim)
title('lsqcurvefit函数');



%% 5 fsolve()函数 %默认算法trust-region-dogleg
modelfun3 = @(p)(p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5) -y);
p0 = 5*rand(1,5);
OP5 = optimoptions('fsolve','Display','off');
Fit_P = fsolve(modelfun3,beta,OP5);
fit_y5 = Fit_P(1)*x1+Fit_P(2)*sin(Fit_P(3)*x1).*exp(Fit_P(4)*x1)+Fit_P(5);
subplot(3,2,5)
hold on
plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
plot(x1,fit_y5,'-','linewidth',1.5,'color','r')
hold off
box on
title('fsolve函数')



%% 6 粒子群PSO算法
fun6 = @(p) ( norm(p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5) -y) );%这里需要计算误差的平方和
OP6 = optimoptions('particleswarm','InertiaRange',[0.4,1.2],'SwarmSize',100);
[p,~,~,~]  = particleswarm(fun6,5,[-5,-5,-5,-5],[5,5,5,5],OP6);%区间可以稍微放大一些,不怕
y6 = p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5);
subplot(3,2,6)
hold on
plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
plot(x,y6,'-','linewidth',1.5,'color','r')
hold off
box on
ylim(y_lim)
title('PSO算法')

三、多项式曲线

matlab 多维拟合,算法,python,人工智能

 Matlab:

>> x=linspace(0,4*pi,150);
y=cos(x)+10*rand(1);
plot(x,y,'.');
hold on;
[p,s]=polyfit(x,y,9);% 拟合为7阶的函数
x1=linspace(0,4*pi,150);
y1=polyval(p,x1);
plot(x1,y1,'color','r');
p

p =

    0.0000    0.0000   -0.0004    0.0081   -0.0783    0.3753   -0.7660    0.3815   -0.4104   10.6154



% 方程变换
>> x=linspace(0,4*pi,150);
y=2*exp(-(x-1).^2/1.^2)+0.1*rand(1);
plot(x,y,'.')
>> x=linspace(0,4*pi,50);
y=2*exp(-(x-1).^2/1.^2)+0.1*rand(1);
plot(x,y,'.')
>> x=linspace(0,4*pi,50);
y=2*exp(-(x-1).^2/1.^2)+0.1*rand(1);
plot(x,y,'.');
hold on;
[p,s]=polyfit(x,y,9);% 拟合为7阶的函数
x1=linspace(0,4*pi,50);
y1=polyval(p,x1);
plot(x1,y1,'color','r')

matlab 多维拟合,算法,python,人工智能

 从上图我们可以看出9阶的拟合效果要比7阶的好很多,那么我们用c++实现的时候也就按照9阶的来。

matlab 多维拟合,算法,python,人工智能文章来源地址https://www.toymoban.com/news/detail-523888.html

到了这里,关于Matlab 线性拟合、一维、多维度非线性拟合、多项式拟合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3.1 多维度随机变量及其分布

          要学习二维随机变量及联合分布,我会按照以下步骤进行: 了解基本概念:首先要了解二维随机变量的概念,即同时包含两个随机变量的变量。还要了解二维随机变量的取值范围以及联合概率密度函数和联合分布函数的定义。 学习联合分布函数的性质:联合分布函数

    2024年02月06日
    浏览(53)
  • 利用matlab实现非线性拟合(下)

    没看过上一篇的建议看一下前面的上篇。这一篇非线性拟合我就不废话,直接开始了。下面首先介绍几种matlab非线性拟合方法,之后将这几种方法进行对比研究。 如果你喜欢界面化的输入输出,那么可以尝试Curve Fitting App,它在matlab集成的App里面。 界面里常用的拟合方式都有

    2024年02月03日
    浏览(34)
  • SpringBoot进阶教程(七十六)多维度排序查询

    在项目中经常能遇到,需要对某些数据集合进行多维度排序的需求。对于集合多条件排序解决方案也有很多,今天我们就介绍一种,思路大致是设置一个分值的集合,这个分值是按照需求来设定大小的,再根据分值的大小对集合排序。 我们来模拟一个需求,现在需要查询一个

    2024年02月08日
    浏览(30)
  • Python多维矩阵的各个维度表示(axis = ......)

    在python中对多维矩阵进行操作时,往往要指定操作的维度,一般用0,1,-1这样的数字表示矩阵的某一维度。二维矩阵还是好分辨数字表示的维度的,但对于三维矩阵或更高维度的矩阵就不好分辨了。这里只说明三维矩阵的三个维度怎么分辨。 以一个三维矩阵按不同维度求和

    2024年02月13日
    浏览(26)
  • 节点不连续伽辽金方法在求解线性和非线性平流方程中的一维实现(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 本文提

    2024年02月12日
    浏览(41)
  • AIGC ChatGPT 实现动态多维度分析雷达图制作

    雷达图在多维度分析中是一种非常实用的可视化工具,主要有以下优势: 易于理解: 雷达图使用多边形或者圆形的形式展示多维度的数据,直观易于理解。 多维度对比: 雷达图可以在同一张图上比较多个项目或者实体在多个维度上的表现。 数据关系明显: 通过雷达图,可

    2024年02月11日
    浏览(33)
  • 异构区块链的多维度安全检测方案

    摘 要 :异构区块链多维度安全检测方案可以为多样化的区块链平台安全性检测提供统一的测评标准和检测方法,辅助相关部门对区块链平台进行有效检测和监管,促进区块链行业的合规发展。通过分析现有区块链安全检测的需求,针对目前多样性的区块链底层平台,提出普

    2024年02月05日
    浏览(28)
  • 多维度聊一聊 k8s 和 openstack

    k8s 和 openstack 无疑是当今云计算领域的两大巨头,它们分别占据着 IaaS 和 PaaS 领域的事实标准,经常被拿来一起比较。我记得大概在三四年前 k8s 如火如荼的发展的时候,“openstack 已死”,“openstack 没落了”之类的文章层出不穷。但是这么年过去了 openstack 老当益壮依然在云

    2024年01月22日
    浏览(36)
  • 笔记:对多维torch进行任意维度的多“行”操作

    新建torch 取出某一行 取出某一列 一次性取出多行 取出连续的多行 ——有多种操作方式 取出不连续的多行 如:取出第0行和第2行 一次取出多列 取出连续的多列 ——同样拥有多种方案 取出不连续的多列 如取出第0列和第3列 此三维torch可视化如下: 取出三维torch的任意两行(

    2024年02月01日
    浏览(62)
  • 抛开价格,DBeaver真的比Navicat好用吗?多维度测评来了!!!

    今天看到一个很有意思的话题“抛开价格,DBeaver真的比Navicat好用吗?” ,正好自己最近使用的数据库连接工具比较多,两个软件都有使用过,我以自己的使用体验给你对比一下,从这个方面去对比: 1、下载难易 DBeaver是个开源软件,比较容易利用现有的网络资源找到安装包。

    2024年02月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包