Matlab函数与方程求解

关于Matlab的一些基本操作在另一篇博客里有提及

https://blog.csdn.net/Netceor/article/details/95043332

目录

想查找相关内容也可在页面按ctrl+F搜索文字

1.线性方程求解

2.非线性方程求解

3.多项式求解

4.函数创建和应用

5.一元函数的零根

6.符号微积分

7.Taylor级数展开

8.符号公式的替换与数值演算

9.常微分方程

10.高阶微分方程


1.线性方程求解

指令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])实现高斯消元法。

2.非线性方程求解

MATLAB求‘Fun(x)=0’解的指令一般格式:

[x,fval,exitflag,output]=fsolve(Fun,x0,options,p1,p2,...)

示例:求解方程组

  • sin(x)+y+z^{2}e^{x}-4=0
  • x+xy=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

3.多项式求解

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)

4.函数创建和应用

匿名函数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])  %将一个新匿名函数做参数传入

5.一元函数的零根

查找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)

6.符号微积分

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)

7.Taylor级数展开

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)

8.符号公式的替换与数值演算

为了使表达式简洁易读,常用用符号变量替换子表达式, 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)

9.常微分方程

常微分方程:含有未知函数及其导数或微分的方程。若未知函数是一元函数则称常微分方程。微分方程中出现的最高阶导数为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的范围[t0tf],若要获取指定时刻的数值解y的值,用 tspan = [t0,t1,...,tf]来描述指定时刻。(可以是区间,也可以是点

y0 描述初始条件的向量。(tspan左端点对应的函数值,即y1(0)=0,y2(0)=1,y3(0)=1

[T,Y]T为返回数值解中的自变量取值(向量),Y为返回数值解中相应时间TY值(向量)

 

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),'.')

10.高阶微分方程

高阶微分方程可化为一阶微分方程组求解

  • 15
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值