MATLAB解方程篇分为解方程基础篇,常微分方程(ODE)篇,偏微分方程(PDE)篇。此篇为解方程基础篇,在本文中,我们首先介绍解方程的基础知识,然后将使用MATLAB解初高中所学习的多元多次方程及方程组。
符号计算与数值计算的概念
首先需要理清的概念是符号计算与数值计算,符号计算是凭借一系列恒等式、数学定理,通过推理和演绎,获得解析结果的运算手段。数值计算则是使用计算机求数学问题近似解的方法与过程。
那么这两者有什么区别?
>> 2*pi % 数值计算
ans = 6.2832
>> sym(2*pi) % 符号计算
ans = 2*pi
通过实例我们可以体会到二者差异,数值计算是取了近似解(数值解),通过对 π \pi π(pi)取近似值的方法将结果计算出来;而符号计算则将pi当做一个变量,得到了一个绝对准确但有些许滑稽的结果 2*pi。
那么符号计算就是这样的,建立在数值完全准确表达和推演严格解析的基础之上,所得结果完全准确的计算方法。
而数值计算则是采用某种计算手段,如有限元方法、数值逼近、插值法等而得到的解。通过数值计算得到的解并不完全准确,但数值计算胜在运算速度快而且可以对函数没有解析解的情况进行处理。
在进行符号计算的学习前应当先了解什么是数值计算以及如何进行数值计算:数值计算与MATLAB微积分
符号计算
符号计算又称计算机代数,它可以使用计算机推导数学公式,如对表达式进行因式分解、化简、微分、积分、解代数方程、求解常微分方程等。
为了进行上面所说的因式分解等符号计算,我们必须要首先定义符号。
构建符号变量
符号常量是不含变量的符号表达式,用sym函数来创建;符号变量使用sym和syms函数来创建。
sym
构造符号变量和对象。S=sym(s, 参数)
执行时,S为所创建的符号对象,参数表示转换后的格式,可以省略,当被转换的s是数值时,参数可以是’d’, ‘f’, ‘e’或’r’ 4种格式,当被转换的’s’是字符串时,参数可以是’integer’, ‘rational’, ‘real’, ‘positive’, 'clear’等格式。
syms s1 s2 ... sn
等同于 s1=sym(‘s1’), s2=sym(‘s2’)…
在计算物理中,我们更多的使用符号变量。例如使用符号变量构建方程(符号表达式)。使用符号变量,我们可以做到求解代数方程。
clc; clear all
syms a b c x y
f = a*x^2+b*x+c; % 构建方程
solve(f) % solve为求解方程的函数,其中默认自变量为x
% output: ans = [-(b + (b^2 - 4*a*c)^(1/2))/(2*a), -(b - (b^2 - 4*a*c)^(1/2))/(2*a)]
solve(f,a) % 求解方程时可以自定义自变量
% output: ans = -(c + b*x)/x^2
符号表达式的变换
MATLAB的符号数学工具箱提供了collect、expand、horner、factor、simplify和simple等函数实现符号表达式的化简。
计算反函数
函数f(x)存在一个反函数,g(f(x))=x,则g和f互为反函数,MATLAB中finverse函数可以用来求符号函数的反函数
g=finverse(f,v) % 对f(v)按指定自变量v求反函数,当v省略,则对默认的自由符号变量求反函数
% 求符号函数 f=5*sin(x)+y 的反函数
syms x y
f=5*sin(x)+y
g=finverse(f) % 对默认自由变量求反函数
% output: g = -asin(1/5*y-1/5*x)
g1=finverse(f,'y')
% output: g1 = -5*sin(x)+y
计算复合函数
MATLAB提供了compose函数可以求出f(x)和g(y)的复合函数f(g(y))
compose(f,g,x,y,z) % 计算f和g的复合函数,xyz都省略时计算出复合函数为f(g(y))
% xy省略则计算出f(g(z)),都不省略则以x为自由变量计算出f(g(z))并用z代替y
多项式符号表达式
多项式函数如果是包含分子和分母,则可以使用numden函数来进行通分计算,并可以提取分子和分母多项式符号表达式。
[N,D]=numden(s) % 提取多项式符号表达式s的分子和分母,N和D是通分过后的分子和分母多项式符号表达式
f1=sym(1/(x-1)+1/(x+1)+3);
[N1,D1]=numden(f1)
% output: N1 = 2*x+3*x^2-2
% output: D1 = x^2-2
符号微积分、极限和级数
微积分–微分使用diff函数,积分使用int函数实现
diff(f,t,n) % 计算f对符号变量t的n阶微分
% 计算符号表达式f=sin(ax)+y^2*cos(x)的微分
syms a x y
f=sin(a*x)+y^2*cos(x);
dfdx=diff(f) %对默认自由变量x求一阶微分
% output: dfdx = cos(a*x)*a-y^2*sin(x)
dfdy=diff(f,y) %对符号变量
% output: dfdy = 2*y*cos(x)
dfdy2=diff(f,y,2) %对符号变量y求二阶微分
% output: dfdy2 = 2*cos(x)
% 计算符号矩阵的一阶微分
f=sym([sqrt(1+x^2) t^x;exp(x) x+y]);
dfdx=diff(f)
% 输出如下:
% dfdx =
% [ x/(x^2 + 1)^(1/2), t^x*log(t)]
% [ exp(x), 1]
% diff函数还可以用来计算数组各行的差值
a=[1 2 3;1 0 1];
diff(a) % output: ans = 0 -2 -2
积分–例: f = ∫ 0 2 π ∫ 0 a r 2 sin 2 φ d r d φ f=\int_0^{2\pi}\int_0^ar^2\sin^2{\varphi}drd\varphi f=∫02π∫