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

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.rhkb.cn/news/97474.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux操作系统】Linux系统编程中的共享存储映射(mmap)

在Linux系统编程中&#xff0c;进程之间的通信是一项重要的任务。共享存储映射&#xff08;mmap&#xff09;是一种高效的进程通信方式&#xff0c;它允许多个进程共享同一个内存区域&#xff0c;从而实现数据的共享和通信。本文将介绍共享存储映射的概念、原理、使用方法和注意…

uni-app的Vue.js实现微信小程序的紧急事件登记页面功能

主要功能实现 完成发生时间选择功能&#xff0c;用户可以通过日期选择器选择事件发生的时间。实现事件类型选择功能&#xff0c;用户可以通过下拉选择框选择事件的类型。添加子养殖场编号输入框&#xff0c;用户可以输入与事件相关的子养殖场编号。完成事件描述输入功能&#…

C++头文件

C头文件 一般头文件特殊头文件windows.hbits/stdc.h 一般头文件 C头文件是一种包含预定义函数、类和变量声明的文件。它们通常用于在源代码文件中引入外部库或模块的功能。 头文件的作用是提供程序所需的声明信息&#xff0c;以便在源代码文件中使用这些声明。当你在源代码文…

Android Studio实现解析HTML获取图片URL,将URL存到list,进行列表展示

目录 效果build.gradle(app)添加的依赖(用不上的可以不加)AndroidManifest.xml错误代码activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL效果 build.gradle(app)添加的依赖(用不上的可以不加) dependencies {implementation com.square…

使用pnpm workspace管理Monorepo架构

在开发项目的过程中&#xff0c;我们需要在一个仓库中管理多个项目&#xff0c;每个项目有独立的依赖、脚手架&#xff0c;这种形式的项目结构我们称之为Monorepo&#xff0c;pnpm workspace就是管理这类项目的方案之一。 一、pnpm简介 1、pnpm概述 pnpm代表performance npm…

QT SSL handshake failed问题分析与解决 QT基础入门【网络编程】openssl

问题: 使用https方式进行post 和get请求时,有时候会出现SSL handshake failed的问题,其实是调用Qt QNetworkAccessManager出现的问题。 其实SSL握手是建立HTTPS连接过程的第一步。为了验证和建立连接,用户的浏览器和网站的服务器必须经过一系列检查(握手),从而建立HTTP…

OpenCV基础知识(6)— 滤波器

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在尽量保留原图像信息的情况下&#xff0c;去除图像内噪声、降低细节层次信息等一系列过程&#xff0c;被叫做图像的平滑处理&#xff08;或者叫图像的模糊处理&#xff09;。实现平滑处理最常用的工具就是滤波器。通过调节…

RK3588平台开发系列讲解(AI 篇)RKNN C API 详细说明

文章目录 一、API 硬件平台支持说明二、API 函数介绍2.1、rknn_init2.2、rknn_destroy2.3、rknn_query2.4、rknn_inputs_set2.5、rknn_run2.6、rknn_outputs_get2.7、rknn_outputs_release沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解 RKNN C API 详细…

浅析基于视频汇聚与AI智能分析的新零售方案设计

一、行业背景 近年来&#xff0c;随着新零售概念的提出&#xff0c;国内外各大企业纷纷布局智慧零售领域。从无人便利店、智能售货机&#xff0c;到线上线下融合的电商平台&#xff0c;再到通过大数据分析实现精准推送的个性化营销&#xff0c;智慧零售的触角已经深入各个零售…

[Mac软件]MacCleaner 3 PRO 3.2.1应用程序清理和卸载

应用介绍 MacCleaner PRO是一个应用程序包&#xff0c;将帮助您清除磁盘空间并加快Mac的速度&#xff01; MacCleaner PRO - 让您的Mac始终快速、干净和有条理。 App Cleaner & Uninstaller PRO - 完全删除未使用的应用程序并管理Mac扩展。 磁盘空间分析仪PRO-分析磁盘空…

CMC、mAP解析:图像检索领域评价指标

1. CMC&#xff1a; Cumulative Matching Characteristics 累计匹配特征 CMC是一种计算 top-n 的评价指标&#xff0c;主要用来评估闭集中rank-n的正确率。 下面举例说明&#xff1a; 在双模态特征匹配中。底库 Gallery 中有10条数据&#xff08;label分别为1&#xff0c;2&am…

【数据结构OJ题】有效的括号

原题链接&#xff1a;https://leetcode.cn/problems/valid-parentheses/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 这道题目主要考查了栈的特性&#xff1a; 题目的意思主要是要做到3点匹配&#xff1a;类型、顺序、数量。 题目给的例子是比较…

Python web实战之Django 的跨站点请求伪造(CSRF)保护详解

关键词&#xff1a;Python、Web、Django、跨站请求伪造、CSRF 大家好&#xff0c;今天我将分享web关于安全的话题&#xff1a;Django 的跨站点请求伪造&#xff08;CSRF&#xff09;保护&#xff0c;介绍 CSRF 的概念、原理和保护方法. 1. CSRF 是什么&#xff1f; CSRF&#…

VBA技术资料MF43:VBA_Excel中自动填充

【分享成果&#xff0c;随喜正能量】以时寝息&#xff0c;当愿众生&#xff0c;身得安隐&#xff0c;心无动乱。愿我们都能&#xff0c;梦见幸福&#xff01;在踉跄中前进&#xff0c;在跌倒后跃进&#xff0c;逐渐强大.。 我给VBA的定义&#xff1a;VBA是个人小型自动化处理的…

Shell脚本基础( 四: sed编辑器)

目录 1 简介 1.1 sed编辑器的工作流程 2 sed 2.1 基本用法 2.2 sed基本格式 2.2.1 sed支持正则表达式 2.2.2 匹配正则表达式 2.2.3 奇数偶数表示 2.2.4 -d选项删除 2.2.5 -i修改文件内容 2.2.6 -a 追加 2.3 搜索替代 2.4 变量 1 简介 sed是一种流编辑器&#xff0c;…

详解junit

目录 1.概述 2.断言 3.常用注解 3.1.Test 3.2.Before 3.3.After 3.4.BeforeClass 3.5.AfterClass 4.异常测试 5.超时测试 6.参数化测试 1.概述 什么是单元测试&#xff1a; 单元测试&#xff0c;是针对最小的功能单元编写测试代码&#xff0c;在JAVA中最小的功能单…

【前端面试】中大文件上传/下载:中等文件代理服务器放行+大文件切片传输+并发请求+localstorage实现断点续传

目录 中等文件代理服务器放行&#xff1a;10MB为单位 proxy nginx 大文件切片&#xff1a;100MB为单位 断点&#xff1a;存储切片hash 前端方案A localstorage 后端方案B 服务端 上传 前端 后端 下载 前端 后端 多个大文件传输&#xff1a;spark-md5 哈希碰撞…

C语言案例 判断是否为回文数-06.1

题目&#xff1a;随机输入一个5位数&#xff0c;判断它是不是回文数 步骤一&#xff1a;定义程序的目标 编写C程序&#xff0c;随机输入一个5位数&#xff0c;判断它是不是回文数 步骤二&#xff1a;程序设计 原理&#xff1a;即12321是回文数&#xff0c;个位与万位相同&#…

ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步

文章目录 数据聚合一、聚合的种类二、DSL实现聚合1、Bucket&#xff08;桶&#xff09;聚合2、Metrics&#xff08;度量&#xff09;聚合 三、RestAPI实现聚合 自动补全一、拼音分词器二、自定义分词器三、自动补全查询四、实现搜索款自动补全&#xff08;例酒店信息&#xff0…

中大型企业选择CRM系统必备五大功能是什么?

中大型企业的特点是客户数量多&#xff0c;业务复杂&#xff0c;需求多样&#xff0c;对CRM系统的功能和作用有着更高的要求。下面我们从五个方面来为您介绍一下&#xff0c;中大型企业CRM系统的功能及作用。 客户信息管理&#xff1a; CRM系统可以帮助企业收集、存储、分析客…