关于Matlab的一些基本操作在另一篇博客里有提及
https://blog.csdn.net/Netceor/article/details/95043332
目录
想查找相关内容也可在页面按ctrl+F搜索文字
1.线性方程求解
2.非线性方程求解
3.多项式求解
4.函数创建和应用
5.一元函数的零根
6.符号微积分
7.Taylor级数展开
8.符号公式的替换与数值演算
9.常微分方程
10.高阶微分方程
指令x=A\b可求线性方程组Ax=b的特解。
(假如A不是可逆阵,即方程组有可能是欠定或超定的,则x是众多解中(含0最多)的一个或最小二乘解。)
用x=lsqnonneg(A,b)可求出方程组Ax=b的一个非负最小二乘解。
2x+y+3z=5;
x+3y+2z=10;
A=[2 1 3;1 3 2]; b=[5;10];
x=lsqnonneg(A,b)
求通解可对增广矩阵用化最简阶梯形rref([A,b])实现高斯消元法。
MATLAB求‘Fun(x)=0’解的指令一般格式:
[x,fval,exitflag,output]=fsolve(Fun,x0,options,p1,p2,...)
示例:求解方程组sinx+y+z2ex-4=0, x+yx=0, xyz=0
%创建函数funs
function F=funs(x)
F(1)=sin(x(1))+x(2)+x(3)^2*exp(x(1))-4;
F(2)=x(1)+x(1)*x(2);F(3)=x(1)*x(2)*x(3);
%解方程
funs=@(x) [sin(x(1))+x(2)+x(3)^2*exp(x(1))-4; x(1)+x(1)*x(2); x(1)*x(2)*x(3)]
[x,fv]=fsolve(funs,[1,1,1])
%输出
x =
0.0000 0.1291 1.9675
fv =
1.0e-14 *
-0.1332
0.0110
0.0025
p=[1 -7 10] %表示x²-7x+10
r=roots(p) %求根
p=poly(r) %由根创建多项式
A=ones(3) , poly(A) %方阵A的特征多项式
d=eig(A),[v,d]=eig(A) %求方阵A的特征值d与特征向量
polyval(p,[5 0;1 2]) %多项式求值 polyval(p,x) 将x代入p
d=polyder(p) %多项式的的导数
a=[1 -2],b=[1 -5], c=polyder(a,b) %多项式a和b乘积的导数
[q,d]=polyder(a,b) %多项式的商a/b的导数
%用最小二乘法对定点(xi,yi)按n阶多项式拟合 p=polyfit(x,y,n)
x=[1 2 3 4 5],y=[5.5 43.1 128 290.7 498.4]
p=polyfit(x,y,3)
匿名函数y=@(x,a) ... 是Matlab为定义较简单的用户函数(对应一个形式返回参数的表达式)所提供的方便法门;调用时用y(x,a)取得实际返回值。另外,Matlab中对多元函数习惯用向量函数形式表示。
%MATLAB中求y=f(x)在指定区间[a,b]上的局部极小值
fun=@(x) 2*sin(x)-1 %创建与x变量有关的名为fun的函数
[x,f]=fminbnd(fun,3,6) %返回取极小值时自变量值x与函数值f
%求多元函数在向量x0所表示的点附近的极小值
%[x,f]=fminsearch(fun,x0) 或[x,f]=fminunc(fun,x0)
funf=@(x) x(1)^2+2.5*sin(x(2))-x(1)*x(2)^2*x(3)^2;
[x,f]=fminsearch(funf,[1,-1,0])
%Matlab中对多元函数习惯用向量函数形式表示
z=@(x,a,b) a*sin(x(1))+b*cos(x(2))
[x,f]=fminsearch(@(x) z(x,2,1),[0,0]) %将一个新匿名函数做参数传入
查找fun函数在x0附近的零点x及对应的函数值fval,可返回
当x0=[a,b]则表示求[a,b]内的根
[x,fval,exitflag,output] = fzero(fun,x0,options)
x = fzero(@cos,[1 2]) %求cos(x)在1和2之间的零点
x=fzero(@(x)x.^3-2*x-5,2) %求f(x) = x^3-2*x- 5在2附近的根
y=@(x) fzero(@(y) (exp(y)+x^y)^(1/y)-x^2*y,1)
f=arrayfun(y,1:20)
syms x y c % 定义了三个基本的符号对象(变量)
f=2*x^2+y^3-c*x*y % 由基本符合对象组成符号表达式
limit(f,y,1) %求极限 limit(f,v,a)
diff(f,x), diff(f,y,2) %求导数、偏导数 diff(f,v,n),默认一阶
int(f,y) %对f关于变量y的原函数
s=int(f,x,1,2) %求定积分
S = solve(eqn,var) %非线性方程组符号求解
%示例
syms a u v x
S= solve(a*u^2 + v^2 == 0, u - v == 1, a^2 + 6 == 5*a) %S为结构变量
S.u,S.v,S.a
S=solve(x^3-a,x)
S=solve(x^3-1,'Real',true)
taylor(f) 求符号函数f对默认变量的5阶马克劳林展开
taylor(f,v,‘ExpansionPoint’,a,‘Order’,n) %展开到(v-a) ^(n-1)项
syms x y t u v a b
M5=taylor(exp(-x))
f=a*sin(x)*y^x+u*cos(v);
g=exp(v)+b*v^u;
T7=taylor(f,'Order',8,'ExpansionPoint',1)
T2= taylor(g,v,'ExpansionPoint',a,'Order',3)
为了使表达式简洁易读,常用用符号变量替换子表达式, MATLAB提供指令subexpr、 subs实现对表达式的替换
syms x y;
f=x^2*y*sin(x-y);
ES=diff(diff(f,y),x,2)
[RS,ssub]=subexpr(ES,'ssub') %%用符号变量ssub置换相同的表达式,重写ES为RS
RES=subs(ES,x-y,'ttt') % 用ttt置换ES中x-y,产生RES。
对符号推演得到的公式,常需代入具体参数计算其数值,这是可用串演算指令eval('字符串表达式或符号表达式'),其功能是将字符串或符号公式当作Matlab指令、表达式执行。
x=1,y=1
dzdxy11=eval(ES)
常微分方程:含有未知函数及其导数或微分的方程。若未知函数是一元函数则称常微分方程。微分方程中出现的最高阶导数为n阶,则称n阶微分方程。
微分方程的解:代入微分方程后,使微分方程成为恒等式的已知函数。n阶微分方程的解函数中含n个独立任意常数,则称通解;若通解中的任意常数都被确定,则称特解。
Matlab求常微分方程解析解指令:
dsolve('deq1==0,...,deqn==0','...定解条件...'[,'指定自变量'])
y=dsolve('D2y+2*Dy-3*y-cos(x)==0','y(0)=4/5,Dy(0)=11/10','x')
S=dsolve('Dx==2*y,D2y=Dy/t'), S.x,S.y %函数默认自变量为t
求公式解较困难,大多无公式解;实用中常求近似的数值解,即用数表法表示解函数
通常用法:
[T,Y] = solver(@odefun,tspan,y0)
sol = solver(odefun,[t0 tf],y0...)
其中: 求解函数是 ode45, ode23, ode113, ode15s, ode23s, ode23t, or ode23tb中的一个。
odefun:微分方程y’=f(t,y)的右端函数.
tspan:指定数值解中时间t的范围[t0,tf],若要获取指定时刻的数值解y的值,用 tspan = [t0,t1,...,tf]来描述指定时刻。(可以是区间,也可以是点)
y0 :描述初始条件的向量。(tspan左端点对应的函数值,即y1(0)=0,y2(0)=1,y3(0)=1)
[T,Y]:T为返回数值解中的自变量取值(向量),Y为返回数值解中相应时间T的Y值(向量)
dy=@(t,y) [y(2) * y(3);-y(1) * y(3);-0.51 * y(1) * y(2)]
[T,Y] = ode45(dy,[0 12],[0 1 1]); %t取值范围:0-12,端点函数值分别0、1、1
plot(T,Y(:,1),'-',T,Y(:,2),'-.',T,Y(:,3),'.') %figure1
%[T,Y] = ode45(@odef,[0 12],[0 1 1]);
%plot(T,Y(:,1),'-',T,Y(:,2),'-.',T,Y(:,3),'.')
高阶微分方程可化为一阶微分方程组求解