一、数值微积分
1、数值微分
数值差分与差商
微积分中,任意函数f(x)在x0点的导数是通过极限定义的
MATLAB提供了求向前差分的函数diff,其调用格式有三种:
dx=diff(x):计算向量x的向前差分,dx(i)=x(i+1)-x(i),i=1,2,…,n-1。
dx=diff(x,n):计算向量x的n阶向前差分。例如,diff(x,2)=diff(diff(x))。
dx=diff(A,n,dim):计算矩阵A的n阶差分,dim=1时(默认状态),按列计算 差分;dim=2,按行计算差分。
样例一: 设f(x)=sin x , 在[0,2π]范围内随机采样,计算f’(x)的近似值
>> x=[0,sort(2*pi*rand(1,5000)),2*pi];
>> y=sin(x);
>> f1=diff(y)./diff(x);
>> f2=cos(x(1:end-1));
>> d=norm(f1-f2)
d=0.0456
2. 数值积分
在高等数学中,计算定积分依靠微积分基本定理,只要找到被积函数f(x)
的原函数大F(x),则可用牛顿—莱布尼兹(Newton-Leibniz)公式:
基于自适应辛普森方法
[I,n]=quad(filename,a,b,tol,trace)
基于自适应Gauss-Lobatto方法
[I,n]=quadl(filename,a,b,tol,trace)
其中,filename是被积函数名;a和b分别是定积分的下限和上限,积分限[a,b] 必须是有限的,不能为无穷大(Inf);tol用来控制积分精度,默认时取 tol=10-6;trace控制是否展现积分过程,若取非0则展现积分过程,取0则不展 现,默认时取trace=0;返回参数I即定积分的值,n为被积函数的调用次数。
样例二:分别用quad函数和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)
>> (atan(1)-atan(0))*4
ans=3.141592653589793
样例三:分别求二重积分和三重积分。
>> 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)
I1=1.574498141468206
I2= 1.732762223027684
(CSDN编辑器直接从命令行窗口复制结果粘贴到markdown编辑器上会有bug)
二、数值方程
线性方程组求解
直接法
高斯(Gauss)消去法 列主元消去法 矩阵的三角分解法
样例四:利用左除运算符的直接解法
>> A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
>> b=[13,-8,6,0]';
>> x=A\b
迭代法
雅可比(Jacobi)迭代法
function [y,n]=jacobi(A,b,x0,ep)
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
B=D\(L+U);
f=D\b;
y=B*x0+f;
n=1;
while norm(y-x0)>=ep
x0=y;
y=B*x0+f;
n=n+1;
end
高斯-赛德尔(Gauss-Serdel)迭代法
function [y,n]=gauseidel(A,b,x0,ep)
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
B=(D-L)\U;
f=(D-L)\b;
y=B*x0+f;
n=1;
while norm(y-x0)>=ep
x0=y;
y=B*x0+f;
n=n+1;
end
样例五:分别用雅可比迭代法和高斯-赛德尔迭代法求解线性方程组。
>> 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]=gauseidel(A,b,[0,0,0]',1.0e-6)
结果:
非线性方程求解与函数极值计算
1、非线性方程求解
单变量方程函数的调用格式为:
x=fzero(filename,x0)
其中,filename是待求根方程左端的函数表达式,x0是初始值。
在MATLAB的最优化工具箱中提供了非线性方程组的求解函数fsolve,其调用
格式如下:
x=fsolve(filename,x0,option)
样例六:求下列方程组在(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)];
>> f([1,1,1])
>> x=fsolve(f,[1,1,1],optimset('Display','off'))
>> f(x)
x= -0.593079135684327
y= 0.000000000000930
z= 0.000638901649239
2.函数极值的计算
求最小值的函数为:
[xmin,fmin]=fminbnd(filename,x1,x2,option)
[xmin,fmin]=fminsearch(filename,x0,option)
[xmin,fmin]=fminunc(filename,x0,option)
其中,xmin表示极小值点,fmin表示最小值,filename是定义的目标函数。第一 个函数的输入变量xl、x2分别表示被研究区间的左、右边界。后两个函数的输入 变量x0是一个向量,表示极值点的初值。option为优化参数,可以通过optimset 函数来设置。
样例七:求函数
在区间(-10,-1)和(1,10)上的最小值点。
>> f=@(x) x-1./x+5;
>> [xmin,fmin]=fminbnd(f,-10,-1)
>> [xmin,fmin]=fminbnd(f,1,10)
(-9.999946678462546,-4.899946145244329)
(1.000053455645318,5.0001069084332830
常微分方程数值求解
MATLAB提供了多个求常微分方程初值问题数值解的函数,一般调用格式为: [t,y]=solver(filename,tspan,y0,option) 其中,t和y分别给出时间向量和相应的数值解。solver为求常微分方程数值解 的函数。filename是定义f(t,y)的函数名,该函数必须返回一个列向量。 tspan形式为[t0,tf ],表示求解区间。y0是初始状态列向量。Option是可选 参数,用于设置求解属性,常用的属性包括相对误差值RelTol ( 默认值是 10-3) 和绝对误差值AbsTol(默认值是 10-6)。常微分方程数值求解函数的统一命名格式:ode nn xx
三、符号微积分
求符号函数极限的命令为limit,其调用格式为: limit(f,x,a) 即求函数f关于变量x在a点的极限。 limit函数的另一种功能是求单边极限,其调用格式为: limit(f,x,a,‘right’) limit(f,x,a,‘left’)
MATLAB中的求导函数为: diff(f,x,n) 即求函数f关于变量x的n阶导数。参数x的用法同求极限 函数limit,可以缺省,默认值与limit相同,n的默认值 是1。
(1)不定积分 在MATLAB中,求不定积分的函数是int(),其常用 的调用格式为: int(f,x) 即求函数f对变量x的不定积分。
(2)定积分 在MATLAB中,定积分的计算也使用int()函数,但调用格式有区别: int(f,x,a,b) 其中,a、b分别表示定积分的下限和上限。
样例八:河道水流量的估算问题
xi=0:50:600;
yi=[4.4,4.5,4.6,4.8,4.9,5.1,5.4,5.2,5.4,5.2,4.9,4.8,4.7];
p=polyfit(xi,yi,3);
plot(xi,yi,'o',xi,polyval(p,xi));
syms y x;
y=poly2sym(p,x);
s=int(y,x,0,600);
v=s*0.6;
eval(v)
四、符号方程
在MATLAB中,求解用符号表达式表示的代数方程可由函数 solve()实现,其调用格式为: ① solve(s):求解符号表达式s的代数方程,求解变量为 默认变量。 ② solve(s,v):求解符号表达式s的代数方程,求解变量 为v。 ③ solve(s1,s2,…,sn,v1,v2,…,vn):求解符号表达式 s1,s2,…,sn组成的代数方程组,求解变量分别为v1, v2,…,vn。
样例九:
解方程
>> syms x y a b c;
>> solve(a*x^2+b*x+c==0)
标签:函数,求解,积分,微积分,数值,filename,matlab,diff,x0
来源: https://blog.csdn.net/qq_41622092/article/details/89057817