Matlab实例学习------多项式和非多项式曲线拟合(实例)

具体实例:(多项式和非多项式,附带程序注释)

% 曲线拟合

%% 多项式曲线拟合
x=-pi:0.1:pi;
y=sin(x);
plot(x,y);%原始曲线

p0=polyfit(x,y,4);%绘制4阶拟合曲线  返回多项式的系数向量

y1=polyval(p0,x);%多项式求值
% The polynomial  is evaluated at x =5, 7, and 9 with
% p = [3 2 1];
% polyval(p,[5 7 9])
%
% which results in
% ans =
%     86   162   262

plot(x,y,x,y1,'r');  %绘制原始图形和拟合图形
poly2sym(p0)%将多项式打印出来
%结果:
% ans =
%
% - (2504756088051987*x^4)/2305843009213693952 - (3360678413491453*x^3)/36028797018963968 + (2066488371929293*x^2)/288230376151711744 + (7714426024601503*x)/9007199254740992 - 2922386864273423/576460752303423488

%% 多项式拟合正弦函数曲线
% 原始数据点
x0 = -pi:0.1:pi;
y0 = sin(x0);
% 4次多项式拟合
p0 = polyfit(x0, y0, 4);
y1 = polyval(p0, x0);
plot(x0, y0, x0, y1, 'r');

%% 多项式拟合效果
% 阶次越高,并不一定拟合效果越好
x1 = -1:0.2:1;
y1 = 1./(1 + 25*x1.^2);
% 分别使用3次、5次、8次多项式拟合
p3 = polyfit(x1, y1, 3);
p5 = polyfit(x1, y1, 5);
p8 = polyfit(x1, y1, 8);

x  = -1:0.01:1;
y  = 1./(1 + 25*x.^2);
y3 = polyval(p3, x);
y5 = polyval(p5, x);
y8 = polyval(p8, x);
figure
plot(x, y, x, y3, 'r-', x, y5, 'm:', x, y8, 'b--');
legend('原始', '3次', '5次', '8次');

%% 使用非多项式拟合方法
x  = -1:0.01:1;
y  = 1./(1 + 25*x.^2);
% 首先建立拟合选项结构体
options = fitoptions('Method', 'NonlinearLeastSquare');
options.Lower = [-Inf, -Inf, -Inf];%设置a,b,c三个参数的最大值和最小值范围
options.Upper = [Inf, Inf, Inf];
% 通过fittype建立非线性拟合模型
type    = fittype('a/(b + c*x^n)', 'problem', 'n', 'options', options);
%参数介绍
% a/(b + c*x^n)为模型,本例中要拟合的是:1/(1+25*x^2)
% 'problem', 'n'指定了n不是系数并且n的值是可变的
% 'optoins',指定fitoptions
% 返回值:
% g = fittype('a*cosh((x-x0)/a)+y0')
%
% g =
%      General model:
%      g(a,x0,y0,x) = a*cosh((x-x0)/a)+y0

% 拟合
[cfun gof] = fit(x', y', type, 'problem', 2);
% 注意:要使用列向量,由于模型中规定了problem,所以要给n一个具体的值
% 返回值:
% cfun表示拟合的函数,包含模型,系数,n的值等各种信息
% gof表示拟合的好坏

% 拟合效果
ynp = feval(cfun, x);%根据fit返回的cfun和x的值得到x对应的y值,用来绘制曲线
figure
hl = plot(x, y, 'k');%绘制原来的曲线
set(hl, 'LineWidth', 10);%设置曲线的宽度,方便进行比较
hold on  %保持当前的图像,并且将新的图像添加到当前图像中
plot(x, ynp, 'r');%绘制使用非多项式拟合后的图像
legend('原来的曲线','使用非多项式拟合的曲线');

实验结果:(多项式拟合正弦函数曲线和非多项式拟合实例结果)

时间: 2024-10-05 13:09:16

Matlab实例学习------多项式和非多项式曲线拟合(实例)的相关文章

acl 通信库之非阻塞网络编程实例讲解

一.概述 acl 库的 C 库(lib_acl) 的 aio 模块设计了完整的非阻塞异步 IO 通信过程,在 acl 的C++库(lib_acl_cpp) 中封装并增强了异步通信的功能,本文主要描述了 acl C++ 库之非阻塞IO库的设计及使用方法,该异步流的设计思路为:异步流类与异步流接口类,其中异步流类对象完成网络套接口监听.连接.读写的操作,异步流接口类对象定义了网络读写成功/超时回调. 连接成功回调.接收客户端连接回调等接口:用户在进行异步编程时,首先必须实现接口类中定义的纯方法,然后

NTT+多项式求逆+多项式开方(BZOJ3625)

定义多项式h(x)的每一项系数hi,为i在c[1]~c[n]中的出现次数. 定义多项式f(x)的每一项系数fi,为权值为i的方案数. 通过简单的分析我们可以发现:f(x)=2/(sqrt(1-4h(x))+1) 于是我们需要多项式开方和多项式求逆. 多项式求逆: 求B(x),使得A(x)*B(x)=1 (mod x^m) 考虑倍增. 假设我们已知A(x)*B(x)=1 (mod x^m),要求C(x),使得A(x)*C(x)=1 (mod x^(2m)) 简单分析可得C(x)=B(x)*(2-A

递归转非递归(实例)

递归调用示例算法1.10  求取数组元素的最大值(递归算法)    procedure MAX1(i)    // 查找数组A中最大值元素,并返回该元素的最大下标.//        global integer n,A(1:n),j,k        integer i        if i<n then j←MAX1(i+1)  //递归调用//               if A(i) > A(j) then k←i                   else k←j       

[Codeforces438E][bzoj3625] 小朋友和二叉树 [多项式求逆+多项式开根]

题面 传送门 思路 首先,我们把这个输入的点的生成函数搞出来: \(C=\sum_{i=0}^{lim}s_ix^i\) 其中\(lim\)为集合里面出现过的最大的数,\(s_i\)表示大小为\(i\)的数是否出现过 我们再设另外一个函数\(F\),定义\(F_k\)表示总权值为\(k\)的二叉树个数 那么,一个二叉树显然可以通过两个子树(可以权值为0,也就是空子树)和一个节点构成 那么有如下求\(F\)的式子 \(F_0=1\) \(F_k=\sum_{i=0}^k s_i \sum_{j=0

CF438E The Child and Binary Tree(生成函数+多项式开根+多项式求逆)

传送门 可以……这很多项式开根模板……而且也完全不知道大佬们怎么把这题的式子推出来的…… 首先,这题需要多项式开根和多项式求逆.多项式求逆看这里->这里,这里讲一讲多项式开根 多项式开方:已知多项式$A$,求多项式$B$满足$A^2\equiv B\pmod{x^n}$(和多项式求逆一样这里需要取模,否则$A$可能会有无数项) 假设我们已经求出$A'^2\equiv B\pmod{x^n}$,考虑如何计算出$A^2\equiv B\pmod{x^{2n}}$ 首先肯定存在$A^2\equiv B

Matlab实例学习--------不同界面的数据传递(多窗口编程)(实例)

实现功能为:两个窗口,一个主窗口一个子窗口.主窗口中有文本框和按钮,文本框用来显示子窗口中按钮的点击次数,按钮用来打开子窗口.     子窗口中包含文本框和两个按钮,文本框显示按钮点击次数,第一个按钮用来增加点击次数,第二个按钮用来返回主窗口. 实现步骤: (1)创建两个GUI界面,分别为主窗口和子窗口,设置好相关属性和Tag等信息: (2)编写主程序的回调函数:(主要是添加了按钮的响应函数) function varargout = main(varargin) % Begin initial

菜鸟之路--线性表__多项式操作(多项式加减乘)

/* <span style="font-size:18px;">代码里的使用的链表请见<a target=_blank href="http://blog.csdn.net/u013303425/article/details/41320861"> http://blog.csdn.net/u013303425/article/details/41320861</a></span> */ #include<st

Matlab实例学习----数据传递

(1)数据传递 global的实例: 实现GUI中单击按钮文本中的数字增加和减少: 创建GUI,添加静态文本,两个按钮,设置Tag和其他属性: 为按钮添加回调函数: function varargout = gui_var(varargin) % GUI_VAR MATLAB code for gui_var.fig % GUI_VAR, by itself, creates a new GUI_VAR or raises the existing % singleton*. % % H = G

Matlab实例学习-----Matlab与Excel交互,Matlab作为自动化客户端调用Excel服务器

(1)xlsread  从Excel中读取数据 语法: [num,txt,raw] = xlsread(filename) [num,txt,raw] = xlsread(filename,-1) [num,txt,raw] = xlsread(filename,sheet) [num,txt,raw] = xlsread(filename,range) [num,txt,raw] = xlsread(filename,sheet,range) [num,txt,raw] = xlsread(f