备战数学建模7-MATLAB数值微积分与方程求解
目录
一、数值微分与数值积分
1-数值微分的基本原理
2-数值微分的实现
3-数值积分的基本原理
4-数值积分的实现方法
二、线性方程组
三、非线性方程组
1-单变量非线性方程的求解
2-函数极值的计算
3-最小值问题的应用实例
四、常微分方程
1-常微分方程的一般概念
2-常微分方程的求解函数
一、数值微分与数值积分
1-数值微分的基本原理
当f(x)函数比较复杂,或者以离散列表的形式给出的时候,如果要求导数值,可以用数值方法。
任意函数f(x)在x0点的导数是通过极限定义的,有如下三种形式:
如果去掉极限h趋向于0的极限过程,我们可以理解为该函数是以h为步长的向前,向后,中心差分。差分近似等x在x0点的微分,如下所示:
下面我们看一下差商公式,近似等于x在x0点的的导数。
2-数值微分的实现
MATLAB中提供了求向前差分的函数diff(),其有如下三种调用格式:
(1) dx = diff(x) 表示计算向量x的一阶向前差分,dx(i) = x(i+1) - x(i).
(2) dx = diff(x,n) 表示计算x的n阶向前差分,diff(x,2) = diff(diff(x)).
(3) dx = diff(x,n.,dim) 表示计算矩阵A的n阶差分,dim=1,是默认差分,案列计算差分,dim=2时,按行计算差分.
我们看一下上面的例子1,具体的代码如下:
x = [0, sort(2*pi*rand(1,5000)), 2*pi] ;
y = sin(x) ;
f1 = diff(y) ./ diff(x) ; %微分的除法,也就是求导
f2 = cos(x(1:end-1)) ;
plot(x(1:end-1), f1, x(1:end-1), f2) ; %绘制f1和f2的曲线
d = norm(f1 - f2) %求范数
或者的图像我们可以看出,两条曲线基本重合,所以f1和f2近似相等。
3-数值积分的基本原理
如果函数的原函数可以找到,那么可以使用牛顿-莱布尼茨公式求解定积分,如下所示:
但是有些时候原函数很难找到,这时候就需要使用数值积分的方式求解定积分。
数值积分的基本原理就是将区间划分为许多的小区间,这样求定积分就分解成求和问题,如下所示:
4-数值积分的实现方法
MATLAB中提供了求定积分的方法,函数的调用格式如下:
1-基于自适应的辛普森方法,[I,n] = quad(filname,a,b,tol,trace)
2-基于自适应的Gauss-Labatto方法 [I,n] = quadl(filename,a,b,tol,trace)
其中,filename是被积函数名,a,b是积分上下限,tol用来控制积分精度,trace控制是否展现积分过程,返回的I是定积分的值,返回的n是被调用的次数。
我们看一下上面的例子2,我们通过调用两个方法计算的结果I都是等于3.14,而quad()函数的调用次数是61次,而quadl()函数的调用次数是48次,故此处明显 quadl()的执行效率更高,具体的代码如下所示:
format long
f = @(x) 4./(1+x.^2) ;
[I,n] = quad(f,0,1,1e-8)
[I,n] = quadl(f,0,1,1e-8)
MATLAB中也提供了如下求解定积分的方法,基于全局自适应的球定积分方法,
I = integral(filename, a, b) ,其中,filename是被积函数,a,b是定积分的上下限,积分限可以无穷大。
我们看一下上面的例子3,求解定积分。
f = @(x) 1./(x.*sqrt(1-log(x).^2)) ;
I = integral(f,1,exp(1))
MATLAB中还提供了基于高斯-克朗罗德方法去求解震荡函数的定积分,函数的调用格式如下:
[I,err] = quadgk(filename, a, b) ,其中err返回近似误差范围,积分上下限可以是无穷大,也可以是复数,即在复数平面去积分
我们看一下上面的求震荡函数定积分的例子4,具体的代码如下所示:
f = @(x) sin(1./x)./(x.^2);
I = quadgk(f, 2/pi, +inf)
MATLAB中提供对于多重积分的求解方法,具体如下所示:
我们看一下上面的例子6,代码如下所示:
f1 = @(x,y) exp(-x.^2/2) .* sin(x.^2+y) ;
I1 = quad2d(f1,-2,2,-1,1)
f2 = @(x,y,z) 4*x.*z.*exp(-z.*z.*y-x.*x) ;
I2 = integral3(f2,0,pi,0,pi,0,1)
二、线性方程组
一般包含两大类方法,即直接求解发和迭代法。
我们先看第一类,直接求解法:
1-高斯消去法;2-列主元消去法;3-矩阵的三角分解法
利用左除运算符直接求解,如下所示:
我们看一下上面的例子1,用直接法求解线性方程组,具体代码如下:
A = [2,1,-5,1; 1,-5,0,7; 0,2,1,-1; 1,6,-1,-4] ;
b = [13; -9; 6; 0] ;
A\b
下面看一下利用矩阵分解方法求解线性方程组。
MATLAB的LU分解函数的调用格式如下:
[L,U] = lu(A)表示产生一个上三角矩阵U和一个变换形式的下三角矩阵L,使得满足A=LU,注意,这里的矩阵A必须是方阵。
[L,U,P] = lu(A) 表示产生一个上三角矩阵L和一个下三角矩阵U和一个置换矩阵P,使得PA=LU
具体的转换形式如下所示,两种矩阵分解方法求线性方程组。
我们看一下上面的例子2,使用LU分解方法求解线性方程组,代码如下:
A = [2,1,-5,1; 1,-5,0,7; 0,2,1,-1; 1,6,-1,-4] ;
b = [13; -9; 6; 0] ;
[L,U] = lu(A) ;
x = U\(L\b)%这样写也是可以的
[L,U,P] = lu(A) ;
x = U\(L\P*b)
三、非线性方程组
1-单变量非线性方程的求解
MATLAB中提供fzero()函数求解单变量非线性方程,函数的调用格式入下所示:
fzero(filename, x0) ,其中filename是方程左端的函数表达式,x0是初始值。
我们看一下上面的例子1,用fzero()函数求解非线性方程组,迭代初始值的选取很重要。
代码如下:
f = @(x) x - 1./x + 5 ;
x1 = fzero(f, -5)
x2 = fzero(f, 1)
MATLAB中提供了fsolve()函数完成非线性方程组的求解,函数的具体调用个数如下:
x = fsolve(filename, x0, option),x为返回的近似解,filename为待求根方程左端的表达式,x0是初值,option用于设置优化工具箱的参数,可以调用optimset函数来设置。
我们可以看一下上面的例子2,使用fsolve()函数求解非线性方程组在(1,1,1)附近的解,代码如下:
f = @(x) [sin(x(1)) + x(2)+x(3)^2*exp(x(1)), x(1)+x(2)+x(3),x(1)*x(2)*x(3)] ;x = fsolve(f, [1,1,1], optimset('Display', 'off'))
2-函数极值的计算
MATLAB中秩考虑函数极小值问题,如果要求极大值,可以用求函数负值的极小值来解决。
1-无约束优化
MATLAB提供了三种求极小值的函数。
[xmin, fmin] = fminbnd(filename, x1, x2, option)
[xmin, fmin] = fminsearch(filename, x0,option)
[xmin, fmin] = fminunc(filename,x0,option)
其中filename是定义的目标函数,第一个函数的x1,x2表示被研究的区间的左右边界,后面两个函数的x0是一个向量,表示极值点的初值,option表示优化选项。
我们看一下上面的例子3,求函数在求间内的最小值点,代码如下所示:
f = @(x) x - 1./x + 5 ;[xmin, fmin] = fminbnd(f, -10, -1) [xmin, fmin] = fminbnd(f, 1, 10)
2-有约束的优化
MATLAB中提供了求解有约束的条件下的函数最小值,函数的调用格式为:
[xmin, fmin] = fmincon(filename, x0,A,b,Aeq,beq,Lbnd,Ubnd,Nonf,option)
其中filename为函数,x0为初始值,A为系数矩阵,b为结果矩阵,其余分别为线性不等式约束,线性等式约束,x的下界和上界,非线性约束,优化选项。如果约束条件不存在,可以用空矩阵来表示。
我们使用fmincon()函数求解有约束的最小值问题。
f =@(x) 0.4*x(2) + x(1)^2 + x(2)^2 - x(1)*x(2) + 1/30*x(1)^3 ;
A = [-1,-0.5; -0.5,-1] ;
b = [-0.4; -0.5] ;
lb = [0;0] ;
x0 = [0.5; 0.5] ;
option = optimset('Display','off') ;
[xmin, fmin] = fmincon(f, x0, A,b, [], [], lb, [], [], option)
3-最小值问题的应用实例
我们看一下上面的例子5,其实就是求方程式最小值问题,由题意知:
假设仓库所选点的坐标为(x,y),则总里程的表达式为:
代码如下所示,求出在坐标点(19.814348806223666 41.124724254226052)处建立建立仓库,每周货车的总里程最少,最少为 1361.8公里。
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])
我们看一下例子6,这个是加了一个非线性约束条件,我们可以建立一个约束函数funny,代码如下:
function [c,h] = funny(x)
c = [] ;
h = x(2) - x(1)^2 ;
end
在命令行输入如下代码,完成计算,代码如下:
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] = fmincon(f,[15,30],[],[],[],[],[],[],'funny')
四、常微分方程
1-常微分方程的一般概念
求常微分方程初值问题,就是寻找函数y(t),使其满足如下方程:
2-常微分方程的求解函数
MATLAB中给出了求解常微分方程的函数,其函数调用格式入下:
[t,y] = solver(filename, tspan, y0, option), 其中,t和y分别给出时间向量和数值解,filename是定义f(t,y)的函数名,该函数必须返回一个列向量,tspan表示求解区间,y0是初始向量,option是可选参数,用于设置求解属性。
另外常微分方程的数值求解函数的统一命名格式如下所示:
我们看一下上面的例子1,代码如下所示,并将近似值和精确值绘成曲线继续比较。
f = @(t,y) (y^2-t-2)/(4*(t+1)) ;
[t,y] = ode23(f,[0,10],2) ;
y1 = sqrt(t+1) + 1 ;
plot(t,y,'b:',t,y1,'r');
绘制的图形如下所示:
对于高阶常微分方程,需要先转换为一阶常微分方程,然后进行求解。
对于上面的例子2,改成一阶的常微分方程后,代码如下所示:
f = @(t,x) [-2,0; 0,1] *[x(2); x(1)] ;
[t,x] = ode45(f,[0,20],[1,0]) ;
subplot(2,2,1) ;
plot(t,x(:,2)) ;
subplot(2,2,2)
plot(x(:,2), x(:,1));
绘制的图形如下所示:
备战数学建模7-MATLAB数值微积分与方程求解相关推荐
- 6.数值微积分与方程求解
数值微分与数值积分 % 数值积分 (有函数式版本定积分) 方法1 % [I,n]=quad(filename,a,b,tol,trace) 基于自适应辛普森方法 % [I,n]=quadl(file ...
- 数学建模之matlab软件学习06——专题六 数值微积分与方程求解
#本文章仅用于记录本人学习过程,当作笔记来用,如有侵权请及时告知,谢谢! 6.1 数值微分与数值积分 数值微分 6.2 6.3 线性方程组应用举例: 平面桁架结构受力分析问题 小行星运行轨道计算问题: ...
- 备战数学建模1——MATLAB矩阵,二维图、三维图!(超级全面易懂)
目录 一.矩阵超级基础的内容 1.创建一个1行6列的矩阵 2.对矩阵中每个元素都加3 3.plot函数作图. 4.多维矩阵与常见运算 5.矩阵乘法,和矩阵点乘 6.使用矩阵A对方程A*x= b求解 7 ...
- 专题六数值微积分与方程求解
文章目录 一.数值微分与数值积分 1.数值微分 2.数值积分 二.线性方程求解 1.直接法 2.迭代解法 3.直接法与迭代法的对比 三.非线性方程求解与函数极值计算 1.非线性方程数值求解 2.函数极 ...
- 数值微积分与方程求解
1.数值微分与数值积分 数值微分 MATLAB提供了求向前差分的函数diff,其调用格式有三种: dx=diff(x):计算向量x的一阶向前差分,dx(i)=x(i+1)-x(i),i=1,2,-,n ...
- 6. 数值微积分与方程求解
文章目录 A 数值微分与数值积分 A.a数值微分(diff) A.b 数值积分 B 线性方程组求解 B.a 直接法 B.b 迭代法 B.c 线性方程组应用举例 C 非线性方程求解与函数极值计算 C.a ...
- 数学建模专栏 | 开篇:如何备战数学建模竞赛之 MATLAB 编程
作 者 简 介 卓金武,MathWorks中国高级工程师,教育业务经理,在数据分析.数据挖掘.机器学习.数学建模.量化投资和优化等科学计算方面有多年工作经验,现主要负责MATLAB校园版业务.曾2次获 ...
- matlab app设计步骤_1.1数学建模与MATLAB–MATLAB入门
1.1数学建模与MATLAB–MATLAB入门 关注本专栏,继续分享数学建模与MATLAB知识 一.MATLAB是什么? MATLAB 是目前在国际上被广泛接受和使用的科学与工程计算软件.虽然 Cle ...
- matlab或_数学建模与MATLAB——MATLAB入门
点击上方"蓝字",有更多精彩等着你噢! 关注本专栏,我们将继续分享数学建模与MATLAB知识. 你想要的,我都有! 一MATLAB是什么?MATLAB 是目前在国际上被广泛接受和使 ...
- 备战数学建模(Python)
备战数学建模(Python) Python之建模规划篇 Python之建模数值逼近篇 Python之建模微分方程篇 由于美国大学生数学建模大赛很快就要开赛了,所以我就打算在这几天内,好好的看看< ...
最新文章
- php动态网页转换成html,怎么把动态的php文件转换成静态的html文件,html文件是php文件…...
- 生成器——迭代器工作的工厂
- Marketing Cloud里使用了哪个版本的UI5 Odata模型?
- 数据结构-队列之链式队列
- 《 Spring 实战 》(第4版) 读书笔记 (未完结,更新中...)
- C++ 类设计核查表
- 如何将Anaconda更新到想要的python版本(其实使用的是Anaconda中的切换不同环境的方法,不过步骤挺好)
- java eden区_(转)可能是把Java内存区域讲的最清楚的一篇文章
- 华为回应“锁屏广告”事件:非官方所为
- Android Studio 完美解决 “Android SDK Manager 无法更新“、 ”connection error” 的问题...
- 互联网大数据对教育的重要性
- SQL语句优化技术分析 整理他人的
- 微信小程序实现组件之间的传值
- 电脑文件被删除了,找回文件数据的方法有哪些?
- SimpleMemory博客园主题定制美化 配置
- 钽电解电容跟铝电解电容的区别
- 【12月英语——快乐中学习】
- 结对第二次—文献摘要热词统计及进阶需求
- 连接MySQL的jar包在本地哪里可以找到
- 基于Jetson Nano与STM32通信的颜色识别与伺服驱动器控制