专题六数值微积分与方程求解-1

简介: 专题六数值微积分与方程求解

一、数值微分与数值积分

1、数值微分

MATLAB提供了求向前差分的函数diff,调用格式:

(1)dx=diff(x):计算向量x的向前差分,dx(i)=x(i+1)-x(i),i=1,2,……,n-1。

(2)dx=diff(x,n):计算向量x的n阶向前差分,例如,diff(x,2)=diff(diff(x))。

(3)dx=diff(A,n,dim):计算矩阵A的n阶差分,dim=1时(默认状态),按列计算差分;dim=2时,按行计算差分。

注意:diff函数计算的是向量元素间的差分,故差分向量元素的个数比原向量少了一个。同样对于矩阵,差分后的矩阵比原矩阵少了一行或者一列。

另外,计算差分之后,可以用f(x)在某点的差商作为其导数的近似值。

例子:设f(x)=sinx,在[0,2Π]范围内随机采样,计算f’(x)的近似值,并与理论f’(x)=cosx进行比较

x=linspace(0,2*pi,5000);
y=sin(x);
f1=diff(y)./diff(x);
f2=cos(x(1:end-1));%差分向量元素比原向量元素少了一个
plot(x(1:end-1),f1,'r',x(1:end-1),f2,'b');
d=norm(f1-f2)%求f1,f2的2范数

94c0f5319b3bc80297dc708a0e390892_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JpY2FyZG8y,size_16,color_FFFFFF,t_70.png

2、数值积分

(1)数学原理

常用的求定积分的方式是利用牛顿-莱布尼兹公式:

image.png

但是当被积函数的原函数无法用初等函数表示,或者被积函数是用离散的形式给出,这个时候需要用数值解法求解定积分。

求定积分的数值解法很多种,如梯形法、辛普森法、高斯求积法等等。基本思想都是将积分区间分成n个子区间,这样定积分问题就分解成每个子区间上积分后求和的问题:

image.png

(2)数值积分的实现

  • 基于自适应辛普森方法
    [I,n]=quad(filename,a,b,tol,trace)


  • 基于自适应Gauss-Lobattofangf

[I,n]=quadl(filename,a,b,tol,trace)

其中,filename是被积函数名;a和b分别是定积分的下限和上限,积分限[a,b]必须是有限的,不能为无穷大;tol用来控制积分精度,默认取image.png ;trace控制是否展现积分过程,若取非0则展现,取0则不展现,默认取0;返回参数I即定积分的值,n为被积函数的调用次数。

例子:分别用quad函数和quadl函数求定积分的近似值,并在相同的积分精度下比较被积函数的调用次数。

format long
f=@(x)4./(1+x.^2);
[I1,n1]=quad(f,0,1,1e-8)
[I2,n2]=quadl(f,0,1,1e-8)
(atan(1)-atan(0))*4%输出理论值

基于全局自适应积分方法

I=integral(filename,a,b)

其中,I是计算得到的积分;filename是被积函数;a和b分别是定积分的下限和上限,积分限可以为无穷大。

image.png

0ce7951414f6971a8239852705ebf52f_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JpY2FyZG8y,size_16,color_FFFFFF,t_70.png

  • 基于自适应的Gauss-Lobattofangf(高斯-克朗罗德)方法

[I,err]=quadgk(filename,a,b)

其中,err为返回近似误差范围,其他参数与quad函数相同。积分上下限可以是无穷大(-Inf或Inf),也可以是复数。如果积分上下限是复数,则quadgk函数在复平面上求积分。

image.png

f=@(x)sin(1./x)./x.^2;
I=quadgk(f,2/pi,+Inf)%求得I=1.0000
  • 基于梯形积分法

image.png

其中,向量x、y定义函数关系y=f(x)

trapz函数采用梯形积分法则,积分的近似值为:

image.png

例子:设x=1:6,y=[6,8,11,7,5,2],用trapz函数计算定积分

x=1:6;
y=[6,8,11,7,5,2];
I1=trapz(x,y)%求得I1=35
I2=sum(diff(x).*(y(1:end-1)+y(2:end))/2)%求得I2=35


(3)多重定积分的数值求解

  • 求二重积分的数值解:image.png

I=integral2(filename,a,b,c,d)

I=quad2d(filename,a,b,c,d)

I=dbquad(filename,a,b,c,d,tol)

  • 求三重积分的数值解:

I=integral3(filename,a,b,c,d,e,f)

I=triplrquad(filename,a,b,c,d,e,f,tol)

image.png

f1=@(x,y)exp(-x.^2/2).*sin(x.^2+y);
I1=quad2d(f1,-2,2,-1,1)%求得I1=1.5745
f2=@(x,y,z)4*x.*z.*exp(-z.^2.*y-x.^2);
I2=integral3(f2,0,pi,0,pi,0,1)%求得I2=1.7328


二、线性方程求解

1、直接法

  • 高斯(Gauss)消去法
  • 列主元消去法
  • 矩阵的三角分解法

(1)利用左除符号

MATLAB提供了一个左除运算符“\”用于求解线性方程组。如线性方程组Ax=b → x=A-1b→x=A\b

如果矩阵A是奇异或者接近奇异的,会给出警告信息。

例子:用左除运算符求解下列线性方程组

image.png

(2)利用矩阵分解求解线性方程组

矩阵分解是将一个给定的矩阵分解成若干个特殊类型矩阵的乘积,从而将一个一般的矩阵计算问题转化为几个易求得特殊矩阵的计算问题。此方法优点是运算速度快,可以节省存储空间。

  • LU分解

①矩阵的LU分解是将一个n阶矩阵A表示为一个下三角矩阵L和一个上三角矩阵U的乘积。只要方阵是非奇异的,LU分解总可以进行。

Ax=b→Ly=b,Ux=y

②MATLAB提供函数lu,有两种调用格式:

[L,U]=lu(A):产生一个上三角阵U和一个变换形式的下三角阵L,使之满足A=LU。注意,这里的矩阵A必须是方阵。

[L,U,P]=lu(A):产生一个上三角阵U和一个下三角阵L以及一个置换矩阵P,使之满足PA=LU。注意,这里的矩阵A必须是方阵。

③所以,可以利用LU分解求解线性方程组:

Ax=b→LUx=b→x=U(L\b)

Ax=b→PAx=Pb→LUx=Pb→x=U(L\P*b)

例子:用LU分解求解下列线性方程组

image.png



  • QR分解
  • Cholesky分解


2、迭代解法

(1)雅可比(Jacobi)迭代法

对于Ax=b,将A分解成(D-L-U),其中D为对角矩阵,L为负的下三角阵,U为负的上三角阵→(D-L-U)x=b


  • 求解公式为:

image.png

与之对应的迭代公式为:

image.png

  • 雅可比迭代法的函数文件jacobi.m
function [y,n]=jacobi(A,b,x0,ep)%xo为迭代初值,ep为迭代精度
D=diag(diag(A));%生成A的对角阵;
L=-tril(A,-1);%生成A的负的下三角阵
U=-triu(A,1);%生成A的负的上三角阵
B=D\(L+U);
f=D\b;
y=B*x0+f;%根据初值x0,求第一次迭代
n=1;
while norm(y-x0)>=ep%根据前后两次迭代结果的2范数是否很接近来判断
    x0=y;
    y=B*x0+f;
    n=n+1;
end


(2)高斯-赛德尔迭代法(Gauss-Serdel)

  • 迭代公式为:

image.png

  • 雅可比迭代法的函数文件GaussSerdel.m
function [y,n]=jacobi(A,b,x0,ep)%xo为迭代初值,ep为迭代精度
D=diag(diag(A));%生成A的对角阵;
L=-tril(A,-1);%生成A的负的下三角阵
U=-triu(A,1);%生成A的负的上三角阵
B=(D-L)\U;
f=(D-L)\b;
y=B*x0+f;%根据初值x0,求第一次迭代
n=1;
while norm(y-x0)>=ep%根据前后两次迭代结果的2范数是否很接近来判断
    x0=y;
    y=B*x0+f;
    n=n+1;
end

(3)例子

  • 分别用雅可比迭代法和高斯赛德尔迭代法求解方程组。迭代初值为0,精度为image.png

image.png

A=[4,-2,-1;-2,4,3;-1,-3,3];
b=[1,5,0]';
[x,n]=jacobi(A,b,[0,0,0]',1.0e-6)
[x,n]=GaussSerdel(A,b,[0,0,0]',1.0e-6)


  • 分别用雅可比迭代法和高斯赛德尔迭代法求解方程组。迭代初值为0,精度为image.png

image.png


A=[1,2,-2;1,1,1;2,2,1];
b=[9;7;6];
[x,n]=jacobi(A,b,[0;0;0],1.0e-6
[x,n]=GaussSerdel(A,b,[0;0;0],1.0e-6)


  • 对比上述两个例子,雅可比迭代法和高斯赛德尔迭代法,其是否收敛、收敛速度的快慢,与实际线性方程组的结构有关


3、直接法与迭代法的对比


  • 直接法:以矩阵初等变换为基础,可以求得方程组的精确解;但是占用的空间内存大、程序实现较为复杂;一般适合求解低阶稠密线性方程组。
  • 迭代法:从给定初始值逐步逼近精确值的过程,求解过程占用存储空间小,程序设计简单;适合求解大型稀疏矩阵线性方程组;要考虑算法的收敛性。


三、非线性方程求解与函数极值计算


1、非线性方程数值求解

(1)单变量非线性方程求解

x=fzero(filename,x0)

其中,filename是待求根方程左端的函数表达式,x0是初始值。


①例子:image.png

f=@(x)x-1./x+5;
x1=fzero(f,-5)
x2=fzero(f,1)
x3=fzero(f,0.1)
fplot(f,[-10,2])
grid on
hold on
fplot(0,[-10,2])
hold on
plot(x1,0,'*',x2,0,'o',x3,0,'p')

d40d8bddc2a330badcfb60864ad315fa_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JpY2FyZG8y,size_16,color_FFFFFF,t_70.png

image.png

所以,利用fzero()函数求解方程,初值的选取很重要。

image.png

f=@(x)x.^2-1;
x=[];
x0=-0.25:0.001:0.25;
for x00=x0
    x=[x,fzero(f,x00)];
end
plot(x0,x,'-o');
xlabel('初值');
ylabel('方程的根');
axis([-0.25,0.25,-1,1])

880b45f531c86ef642a5e90d1ea523b1_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JpY2FyZG8y,size_16,color_FFFFFF,t_70.png

结果表明,相同的根对应的处置范围并不连续,求得的根也并非是离初值比较近的根。所以fzero函数执行的是一个数值搜索的过程,搜索结果依赖于函数特性和指定的函数初值。

(2)非线性方程组的求解

x=fsolve(filename,x0,option)

其中,x为返回的近似解,filename是待求根方程左端的函数表达式,x0是初始值,,option用于设置优化工具箱的优化参数,可以调用optimset函数来完成。例如,Display参数设置为’off’时不显示中间结果。

image.png

1c5d669d5508dca5cac759b7bdc06f3c_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JpY2FyZG8y,size_16,color_FFFFFF,t_70.png

当初值是0.1时,fzero函数无法得到正确的结果,而利用fsolve函数可以。因为不同函数的实现算法不同,适用的场合也不同。

②求下列方程组在(1,1,1)附近的解并对结果进行验证

image.png

(因为迭代法是逼近问题,为了展示效果,设置为format long)


2、函数极值的计算

函数极值包括极大值和极小值,或者叫最大值和最小值。MATLAB只考虑吧最小值的计算。

(1)无约束最优化问题

image.png

求最小值的函数为:

[xmin,fmin]=fminbnd(filename,x1,x2,option)

[xmin,fmin]=fminsearch(filename,x0,option)

[xmin,fmin]=fminunc(filename,x0,option)

其中,xmin表示极小值点,fmin表示最小值。第一个函数的输入变量x1、x2分别表示被研究区间的左右边界。后两个函数的输入变量x0是一个向量,表示极值点的初值。

image.png

(2)有约束最优化问题

image.png

即求取一组x,使得目标函数f(x)为最小,且满足约束条件G(x)≤0。

函数为:

[xmin,fmin]=fmincon(filename,x0,A,b,Aeq,beq,Lb,Ub,nonlcon,option)

其中,A,b,Aeq,beq,Lb,Ub,nonlcon分别表示线性不等式约束、线性等式约束、x的下界和上界、定义非线性约束的函数。如果某个约束不存在,用空矩阵表示。

具体各种约束,请查看:https://ww2.mathworks.cn/help/optim/ug/fmincon.html

例子:①求解有约束的最优化问题

image.png

f=@(x)0.4*x(2)+x(1)^2+x(2)^2-x(1)*x(2)+1/30*x(1)^3;
x0=[0.5;0.5];
A=[-1,-0.5;-0.5,-1];%Ax≤b
b=[-0.4;-0.5];
lb=[0;0];%lb≤x≤ub
option=optimset('Display','off');
[xmin,fmin]=fmincon(f,x0,A,b,[],[],lb,[],[],option)


例子:②此例特殊说明非线性约束

(x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) 执行最小化时,满足 nonlcon 所定义的非线性不等式 c(x) 或等式 ceq(x)。fmincon 进行优化,以满足 c(x) ≤ 0 和 ceq(x) = 0。)


507013c64d0e5307e2afed4b5a0328d4_20210426162407747.png

507013c64d0e5307e2afed4b5a0328d4_20210426162407747.png

编写函数non.m定义非线性约束条件:

function [c,ceq]=non(x);
c=[-x(1).^2+x(2)-x(3).^2
    x(1)+x(2).^2+x(3).^3-20];
ceq=[-x(1)-x(2).^2+2
    x(2)+2*x(3).^2-3];

编写主程序函数

f=@(x)x(1).^2+x(2).^2+x(3).^2+8;;
[xmin,fmin]=fmincon(f,rand(3,1),[],[],[],[],zeros(3,1),[],'non')


(3)最小值问题实例

①假设仓库所选点坐标为(x,y),则总里程表达式为:


image.png

a=[10,30,16.667,0.555,22.2221];
b=[10,50,29,29.888,49.988];
c=[10,18,20,14,25];
f=@(x)sum(c.*sqrt((x(1)-a).^2+(x(2)-b).^2));
[xmin,fmin]=fminsearch(f,[15,30])


②若地域限制,仓库必须建立在 image.png


编写函数non.m定义非线性约束条件:

function [c,ceq]=non(x);
c=[];
ceq=[x(2)-x(1)^2];

编写主程序函数

a=[10,30,16.667,0.555,22.2221];
b=[10,50,29,29.888,49.988];
c=[10,18,20,14,25];
f=@(x)sum(c.*sqrt((x(1)-a).^2+(x(2)-b).^2));
option=optimset('Display','off');
[xmin,fmin]=fmincon(f,[15,30],[],[],[],[],[],[],'non',option)


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
负载均衡 容灾 数据管理
TiDB中PD调度器概述
【2月更文挑战第28天】PD调度器是TiDB的关键组件,负责全局元数据管理、负载均衡和自动容灾恢复。采用分布式架构,通过Raft协议保证高可用性,提供API接口供外部系统使用。它能智能调度数据分布,确保集群性能和稳定性,适用于高可用、高性能场景。理解PD调度器有助于优化TiDB集群,未来将持续进化以提供更佳服务。
|
Ubuntu NoSQL IDE
树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译
树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译
树莓派开发笔记(二):qt开发环境搭建:树莓派qt编译和宿主机qt交叉编译
|
12月前
|
人工智能 算法 机器人
2026:具身智能软件——开发者工具、范式与方向
具身智能的未来之战,本质上将是一场软件范式的竞争。正如早期PC和智能手机的革命最终由操作系统和应用生态所定义,具身智能的泛化能力和落地速度,也取决于其软件开发工具链和范式的革新。本报告将聚焦于加速这一转折的三大核心软件范式,深入剖析其技术内涵、主流工具,并为具身智能开发者构建一份面向2026年的前瞻性技能图谱。
2199 4
【计算巢】网络拓扑结构的比较分析:星形、环形与总线型
【5月更文挑战第31天】本文介绍了网络的三种常见拓扑结构:星形、环形和总线型。星形拓扑易于管理和维护,信息传递高效;环形拓扑结构简单,信息环状传递,但环中断可能导致网络瘫痪;总线型成本低、扩展易,但总线故障会全局影响。理解其特点有助于根据需求选择合适的网络结构。
1640 1
|
SQL XML Java
【MyBatis】 MyBatis与MyBatis-Plus的区别
【MyBatis】 MyBatis与MyBatis-Plus的区别
8606 0
【MyBatis】 MyBatis与MyBatis-Plus的区别
|
自然语言处理 监控 程序员
本地部署企业级自适应 RAG 应用的方法与实践
本文介绍了本地部署企业级自适应RAG(Adaptive Retrieval-Augmented Generation)应用的方法与实践。RAG结合信息检索与文本生成,广泛应用于问答、编程等领域。自适应RAG通过分类器评估查询复杂度,动态选择无检索、单步检索或多步检索策略,优化生成结果。其特点在于灵活性和适应性,能够根据输入情况调整检索和生成策略。核心技术包括检索策略的自适应、生成策略的自适应以及模型参数的自适应调整。通过实战,深入了解了RAG的工作原理和应用场景,并获得了宝贵经验。
2097 4
|
网络协议 Ubuntu 安全
在Ubuntu上安装和配置配置服务器防火墙(CSF)的方法
在Ubuntu上安装和配置配置服务器防火墙(CSF)的方法
653 1
|
存储 缓存 中间件
中间件Cache-Aside(旁路缓存)策略中间件Cache-Aside(旁路缓存)策略
【5月更文挑战第7天】Cache-Aside策略是一种灵活且有效的缓存策略,可以根据应用程序的需求进行定制和优化。
945 7
中间件Cache-Aside(旁路缓存)策略中间件Cache-Aside(旁路缓存)策略
|
vr&ar 图形学 API
Unity与VR控制器交互全解:从基础配置到力反馈应用,多角度提升虚拟现实游戏的真实感与沉浸体验大揭秘
【8月更文挑战第31天】虚拟现实(VR)技术迅猛发展,Unity作为主流游戏开发引擎,支持多种VR硬件并提供丰富的API,尤其在VR控制器交互设计上具备高度灵活性。本文详细介绍了如何在Unity中配置VR支持、设置控制器、实现按钮交互及力反馈,结合碰撞检测和物理引擎提升真实感,助力开发者创造沉浸式体验。
1308 1
|
敏捷开发 前端开发 程序员
Hugeicons Flutter 图标库 | 4000+ 开源免费
在全栈开发的征途中,设计素材的匮乏往往是程序员的一大挑战,尤其是那些为MVP产品增添魅力的元素,比如图标(icons)。 一个优秀的免费图标库,对于快速搭建原型、优化视觉效果至关重要。今天,让我们聚焦于Flutter开发者的一个福音——Hugeicons图标库,它蕴藏着超过4000枚精心设计的图标,为你的应用程序注入无限创意潜力。
697 0
Hugeicons Flutter 图标库 | 4000+ 开源免费