matlab使用教程(19)—曲线拟合与一元方程求根

news2024/12/22 22:05:07

1.多项式曲线拟合

        此示例说明如何使用 polyfit 函数将多项式曲线与一组数据点拟合。您可以按照以下语法,使用 polyfit 求出以最小二乘方式与一组数据拟合的多项式的系数
p = polyfit(x,y,n),
        其中:
        • x y 是包含数据点的 x y 坐标的向量
        • n 是要拟合的多项式的次数
        创建包含五个数据点的 x-y 测试数据。
x = [1 2 3 4 5];
y = [5.5 43.1 128 290.7 498.4];
        使用 polyfit 求与数据近似拟合的三次多项式。
p = polyfit(x,y,3)
p = 1×4
-0.1917 31.5821 -60.3262 35.3400
        使用 polyfit 获取拟合线的多项式后,可以使用 polyval 计算可能未包含在原始数据中的其他点处的多项式。在更小域内计算 polyfit 估计值,并绘制实际数据值的估计值以进行对比。可以为拟合线包含方程注释。
x2 = 1:.1:5;
y2 = polyval(p,x2);
plot(x,y, 'o' ,x2,y2)
grid on
s = sprintf( 'y = (%.1f) x^3 + (%.1f) x^2 + (%.1f) x + (%.1f)' ,p(1),p(2),p(3),p(4));
text(2,400,s)

1.1 预测美国人口

        此示例说明,即使使用次数最适中的多项式外插数据也是有风险且不可靠的。此示例比 MATLAB® 出现得更早。该示例最初作为一个练习出现在 Forsythe、Malcolm 和 Moler 合著的《Computer Methods for Mathematical Computations》一书中,该书由出版商 Prentice-Hall 在1977 年出版。
        现在,通过 MATLAB 可以更容易地改变参数和查看结果,但基础数学原理未变。使用 1910 年至 2000 年的美国人口普查数据创建并绘制两个向量。
% Time interval
t = (1910:10:2000)';
% Population
p = [91.972 105.711 123.203 131.669 150.697 ...
179.323 203.212 226.505 249.633 281.422]';
% Plot
plot(t,p, 'bo' );
axis([1910 2020 0 400]);
title( 'Population of the U.S. 1910-2000' );
ylabel( 'Millions' );

         那么猜想一下 2010 年美国的人口是多少?

p
p = 10×1
91.9720
105.7110
123.2030
131.6690
150.6970
179.3230
203.2120
226.5050
249.6330
281.4220
        将这些数据与 t 中的一个多项式拟合,并使用它将人口数外插到 t = 2010。通过对包含范德蒙矩阵的线性系统求解来获得多项式中的系数,该矩阵为 11×11,其元素为缩放时间的幂,即 A(i,j) = s(i)^(n-j)
n = length(t);
s = (t-1950)/50;
A = zeros(n);
A(:,end) = 1;
for j = n-1:-1:1
A(:,j) = s .* A(:,j+1);
end
        通过对包含范德蒙矩阵最后 d+1 列的线性系统求解,获得与数据 p 拟合的 d 次多项式的系数 cA(:,n-d:n)*c ~= p
        • 如果 d < 10 ,则方程个数多于未知数个数,并且最小二乘解是合适的。
        • 如果 d == 10 ,则可以精确求解方程,而多项式实际上会对数据进行插值。
        在任一种情况下,都可以使用反斜杠运算符来求解方程组。三次拟合的系数为:
c = A(:,n-3:n)\p
c = 4×1
-5.7042
27.9064
103.1528
155.1017
        现在,计算从 1910 年到 2010 年每一年的多项式,然后绘制结果。
v = (1910:2020)';
x = (v-1950)/50;
w = (2010-1950)/50;
y = polyval(c,x);
z = polyval(c,w);
hold on
plot(v,y, 'k-' );
plot(2010,z, 'ks' );
text(2010,z+15,num2str(z));
hold off
        将三次拟合与四次拟合进行比较。请注意,外插点完全不同。
c = A(:,n-4:n)\p;
y = polyval(c,x);
z = polyval(c,w);
hold on
plot(v,y, 'k-' );
plot(2010,z, 'ks' );
text(2010,z-15,num2str(z));
hold off

        随着阶数增加,外插变得越来越不可靠。
cla
plot(t,p, 'bo' )
hold on
axis([1910 2020 0 400])
colors = hsv(8);
labels = { 'data' };
for d = 1:8
[Q,R] = qr(A(:,n-d:n));
R = R(1:d+1,:);
Q = Q(:,1:d+1);
c = R\(Q'*p); % Same as c = A(:,n-d:n)\p;
y = polyval(c,x);
z = polyval(c,11);
plot(v,y, 'color' ,colors(d,:));
labels{end+1} = [ 'degree = ' int2str(d)];
end
legend(labels, 'Location' , 'NorthWest' )
hold off

 2.标量函数的根

2.1 对一元非线性方程求解

        fzero 函数尝试求一个一元方程的根。可以通过用于指定起始区间的单元素起点或双元素向量调用该函数。如果为 fzero 提供起点 x0 fzero 将首先搜索函数更改符号的点周围的区间。如果找到该区间,fzero 返回函数更改符号的位置附近的值。如果未找到此类区间, fzero 返回 NaN。或者,如果知道函数值的符号不同的两个点,可以使用双元素向量指定该起始区间; fzero 保证缩小该区间并返回符号更改处附近的值。
        以下部分包含两个示例,用于说明如何使用起始区间和起点查找函数的零元素。这些示例使用由MATLAB® 提供的函数 humps.m 。下图显示了 humps 的图。
x = -1:.01:2;
y = humps(x);
plot(x,y)
xlabel( 'x' );
ylabel( 'humps(x)' )
grid on

2.2 为 fzero 设置选项

        可以通过设置选项控制 fzero 函数的多个方面。使用 optimset 设置选项。选项包括:
        • 选择 fzero 生成的显示量 - 请参阅“设置优化选项” 、使用起始区间和使用起点。
        • 选择控制 fzero 如何确定它得到根的不同公差 - 请参阅“设置优化选项” 。
        • 选择用于观察 fzero 逼近根的进度的绘图函数 - 请参阅“优化求解器绘制函数” 。
        • 使用自定义编程的输出函数观察 fzero 逼近根的进度 - 请参阅“优化求解器输出函数” 。

2.3 使用起始区间

        humps 的图指示 x = -1 时函数为负数, x = 1 时函数为正数。可以通过计算这两点的 humps 进行确认。
humps(1)
ans = 16
humps(-1)
ans = -5.1378
        因此,可以将 [-1 1] 用作 fzero 的起始区间。fzero 的迭代算法可求 [-1 1] 越来越小的子区间。对于每个子区间, humps 在两个端点的符号不同。由于子区间的端点彼此越来越近,因此它们收敛到 humps 的零位置。要显示 fzero 在每个迭代过程中的进度,请使用 optimset 函数将 Display 选项设置为 iter
options = optimset( 'Display' , 'iter' );
        然后如下所示调用 fzero
a = fzero(@humps,[-1 1],options)
Func-count x f(x) Procedure
2 -1 -5.13779 initial
3 -0.513876 -4.02235 interpolation
4 -0.513876 -4.02235 bisection
5 -0.473635 -3.83767 interpolation
6 -0.115287 0.414441 bisection
7 -0.115287 0.414441 interpolation
8 -0.132562 -0.0226907 interpolation
9 -0.131666 -0.0011492 interpolation
10 -0.131618 1.88371e-07 interpolation
11 -0.131618 -2.7935e-11 interpolation
12 -0.131618 8.88178e-16 interpolation
13 -0.131618 8.88178e-16 interpolation
Zero found in the interval [-1, 1]
a = -0.1316
        每个值 x 代表迄今为止最佳的端点。 Procedure 列向您显示每步的算法是使用对分还是插值。可以通过输入以下内容验证 a 中的函数值是否接近零:
humps(a)
ans = 8.8818e-16
2.4 使用起点
        假定您不知道 humps 的函数值符号不同的两点。在这种情况下,可以选择标量 x0 作为 fzero 的起点。fzero 先搜索函数更改符号的点附近的区间。如果 fzero 找到此类区间,它会继续执行上一部分中介绍的算法。如果未找到此类区间, fzero 返回 NaN
        例如,将起点设置为 -0.2 ,将 Display 选项设置为 Iter ,并调用 fzero
options = optimset( 'Display' , 'iter' );
a = fzero(@humps,-0.2,options)
Search for an interval around -0.2 containing a sign change:
Func-count a f(a) b f(b) Procedure
1 -0.2 -1.35385 -0.2 -1.35385 initial interval
3 -0.194343 -1.26077 -0.205657 -1.44411 search
5 -0.192 -1.22137 -0.208 -1.4807 search
7 -0.188686 -1.16477 -0.211314 -1.53167 search
9 -0.184 -1.08293 -0.216 -1.60224 search
11 -0.177373 -0.963455 -0.222627 -1.69911 search
13 -0.168 -0.786636 -0.232 -1.83055 search
15 -0.154745 -0.51962 -0.245255 -2.00602 search
17 -0.136 -0.104165 -0.264 -2.23521 search
18 -0.10949 0.572246 -0.264 -2.23521 search
Search for a zero in the interval [-0.10949, -0.264]:
Func-count x f(x) Procedure
18 -0.10949 0.572246 initial
19 -0.140984 -0.219277 interpolation
20 -0.132259 -0.0154224 interpolation
21 -0.131617 3.40729e-05 interpolation
22 -0.131618 -6.79505e-08 interpolation
23 -0.131618 -2.98428e-13 interpolation
24 -0.131618 8.88178e-16 interpolation
25 -0.131618 8.88178e-16 interpolation
Zero found in the interval [-0.10949, -0.264]
a = -0.1316
        每个迭代中当前子区间的端点列在标题 a b 下,而端点处的相应 humps 值分别列在 f(a) f(b) 下。
        注意:端点 a b 未按任何特定顺序列出: a 可能大于 b 或小于 b
        对于前 9 步,humps 的符号在当前子区间的两端点都为负号,如输出中所示。在第 10 步, humps 的符号在 a ( -0.10949 ) 处为正号,但在 b ( -0.264) 处为负号。从该点开始,如上一部分中所述,算法继续缩小区间 [-0.10949 -0.264] ,直到它达到值 -0.1316

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/899522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DP读书:鲲鹏处理器 架构与编程(七)ARMv8-A 体系结构

一小时速通ARMv8-A体系结构 一、ARMv8-A处理单元核心架构1. ARMv8-A架构的处理器运行模式a. ARMv8-A的执行架构A. AArch64 执行状态B. AArch32 执行状态 b. ARMv8-A架构支持的指令集c. ARMv8-A 支持的数据类型d. ARMv8-A 的异常等级与安全模型e. ARMv8-A的虚拟化架构f. ARMv8-A…

Vue项目商品购物车前端本地缓存逻辑(适用H5/ipad/PC端)——前端实现购物车删除商品、购物车增减数量,清空购物车功能

一、需求 1、用户选择商品&#xff0c;自动回显在购物车列表中&#xff1b; 2、同个商品追加&#xff0c;购物车列表数量叠加&#xff1b; 3、开启赠送&#xff0c;选中的商品&#xff0c;在购物车中另增一条数据&#xff0c;且购物车列表价格显示为0&#xff1b;其实际价格在…

【OpenVINOSharp】在英特尔® 开发者套件爱克斯开发板使用OpenVinoSharp部署Yolov8模型

在英特尔 开发者套件爱克斯开发板使用OpenVinoSharp部署Yolov8模型 一、英特尔开发套件 AIxBoard 介绍1. 产品定位2. 产品参数3. AI推理单元 二、配置 .NET 环境1. 添加 Microsoft 包存储库2. 安装 SDK3. 测试安装4. 测试控制台项目 三、安装 OpenVINO Runtime1. 下载 OpenVINO…

【无闪烁AI视频制作】

效果查看&#xff1a; https://tianfeng.space/wp-content/uploads/2023/08/8月16日-12.mp4 前言 现在其实有很多的AI视频了&#xff0c;效果也越来越逼真&#xff0c;来看看都是怎么制作的吧&#xff01; 安装 TemporalKit下载 https://github.com/CiaraStrawberry/Tempo…

STM32 F103C8T6学习笔记9:0.96寸单色OLED显示屏—自由取模显示—显示汉字与图片

今日学习0.96寸单色OLED显示屏的自由取模显示: 宋体汉字比较复杂&#xff0c;常用字符可以直接复制存下来&#xff0c;毕竟只有那么几十个字母字符&#xff0c;但汉字实在太多了&#xff0c;基本不会全部放在单片机里存着&#xff0c;一般用到多少个字就取几个字的模&#xff…

操作系统_内存管理(一)

目录 1. 内存管理 1.1 内存管理的概念 1.1.1 内存管理的基本原理和要求 1.1.1.1 程序的链接和装入 1.1.1.2 逻辑地址与物理地址 1.1.1.3 进程的内存映像 1.1.1.4 内存保护 1.1.1.5 内存共享 1.1.1.6 内存分配与回收 1.2 覆盖与交换 1.2.1 覆盖 1.2.2 交换 1.3 连续…

华为认证为什么现在这么受欢迎?

华为认证目前受欢迎的原因有很多&#xff0c;以下是其中一些主要原因&#xff1a; 高质量的认证培训&#xff1a;华为认证提供了一系列高质量的培训课程&#xff0c;涵盖了IT技术、网络安全、云计算等领域。这些培训课程由华为的技术专家和工程师团队设计和提供&#xff0c;内容…

Openlayers 实战 - 地图视野(View)- 图层 -(layer)- 资源(source)显示等级设置

Openlayers 实战 - 地图视野&#xff08;View&#xff09;- 图层 -&#xff08;layer&#xff09;- 资源&#xff08;source&#xff09;显示等级设置 问题原因核心代码完整代码&#xff1a;在线示例 在以往的项目维护中&#xff0c;出现一个问题&#xff0c;使用最新高清底图发…

基于traccar快捷搭建gps轨迹应用

0. 环境 - win10 虚拟机ubuntu18 - i5 ubuntu22笔记本 - USB-GPS模块一台&#xff0c;比如华大北斗TAU1312-232板 - 双笔记本组网设备&#xff1a;路由器&#xff0c;使得win10笔记本ip&#xff1a;192.168.123.x&#xff0c;而i5笔记本IP是192.168.123.215。 - 安卓 手机 1.…

PHP酒店点菜管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 酒店点菜管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/88232051 论文 https://…

ARM体系结构学习笔记:NZCV

NZCV N: negative 算术逻辑运算单元运算结果为负1/正0 Z: zero 算术逻辑运算单元运算结果为零1/非零0 C: 3cases:1 0加法 Carray | Not Carray减法 Not Borrow | Borrow(Not Carray)移位 Bit Shifted | Rotated Out V: 后面详细阐述[外…

【C语言】数组概述

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将带你了解 一维数组&#xff0c;二维数组等相关知识。 目录&#xff1a; &#x1f4d8;前言&#xff1a;&#x1f…

【探索Linux】—— 强大的命令行工具 P.6(调试器-gdb、项目自动化构建工具-make/Makefile)

阅读导航 前言一、什么是调试器二、详解 GDB - 调试器1.使用前提2.经常使用的命令3.使用小技巧 三、项目自动化构建工具 - make/Makefile1. make命令⭕语法⭕常用选项⭕常用操作⭕make命令的工作原理⭕make命令的优势&#xff1a; 2.Makefile文件⭕Makefile的基本结构⭕Makefil…

jvm-运行时数据区概述及线程

1.运行时数据区内部结构 不同的jvm对于内存的划分方式和管理机制存在着部分差异 java虚拟机定义了若干种程序运行期间会使用到的运行时数据区&#xff0c;其中有一些会随着虚拟机的启动而创建&#xff0c;随着虚拟机的退出而销毁&#xff0c;另外一些则是与线程一一对应的&…

过来,我告诉你个秘密:送给程序员男友最好的礼物,快教你对象学习磁盘分区啦!小点声哈,别让其他人学会了!

[原文连接:来自给点知识](过来&#xff0c;我告诉你个秘密&#xff1a;送给程序员男友最好的礼物&#xff0c;快教你对象学习磁盘分区啦&#xff01;小点声哈&#xff0c;别让其他人学会了&#xff01;) 再唱不出那样的歌曲 听到都会红着脸躲避 虽然会经常忘了我依然爱着你 …

linux学习(文件描述符)[13]

所以fork的时候函数执行完毕&#xff0c;但是数据还在缓冲区中未刷新。 所以会有父子两份数据 在fork&#xff08;&#xff09;之前ffush&#xff08;&#xff09;&#xff08;c语言的接口&#xff0c;刷新缓冲区&#xff09;fflush(stdout)&#xff0c;就不会有重复 缓冲区的…

公网远程连接Redis数据库详解

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 前言 洁洁的个人主页 我就问你有没有发挥&#xff0…

动态loading中转页

动态loading中转页 template <div class"loading"><div class"wavy"><!-- --i是自定义属性&#xff0c;可通过var函数调用 --><span style"--i: 1">登</span><span style"--i: 2">录</span>…

银行数据分析师面试题

回答&#xff1a; 1.自我介绍&#xff1a; "大家好&#xff0c;我是XXX&#xff0c;一名数据分析师。我有着对数据的热爱和深入的了解&#xff0c; 希望能够利用我的技能和知识为企业解决问题、做出有效的决策。 在过去的X年里&#xff0c;我一直从事数据分析相关的工作…

【福建事业单位-公基-法】02国家基本制度、公民的基本权利和义务 国家机构

【福建事业单位-公基-法】02国家基本制度 一、国家基本制度1.1 自然资源归属1.2 选举制度1.3 民族区域自治制度总结 二、公民的基本权利和义务1.1 权力1.2 义务总结 三、国家机构3.1 全国人民代表大会3.2全国人民代表大会常务委员会3.3 国家主席3.4国务院3.5监察委3.6 人民法院…