Matlab函数与方程求解

本文全面介绍了Matlab在数学计算领域的应用,涵盖线性方程、非线性方程、多项式、函数创建、一元函数零根、符号微积分、Taylor级数、公式替换、常微分方程及高阶微分方程的求解技巧。

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

https://blog.youkuaiyun.com/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.高阶微分方程

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

### MATLAB 函数方程 使用指南 MATLAB 是一款功能强大的数值计算和可视化软件,广泛应用于工程、科研和数据分析领域[^1]。在 MATLAB 中,函数方程是其核心组成部分之一,它们为用户提供了高效的工具来解决各种数学问题。 #### 1. MATLAB 函数的基本概念 在 MATLAB 中,函数是一段可重复使用的代码块,用于执行特定的任务。用户可以通过定义自己的函数或使用内置函数来实现复杂的计算。函数通常由以下部分组成: - **函数声明**:以 `function` 关键字开头,指定输出变量、函数名称和输入变量。 - **函数体**:包含实现具体功能的代码。 - **返回值**:通过 `return` 或直接赋值给输出变量返回结果。 以下是一个简单的 MATLAB 自定义函数示例,用于计算两个数的乘积: ```matlab function product = multiply(a, b) product = a * b; end ``` 调用该函数时,可以使用以下代码: ```matlab result = multiply(3, 4); disp(result); % 输出 12 ``` #### 2. 方程求解的基本方法 MATLAB 提供了多种工具和函数求解方程,包括线性方程组、非线性方程以及微分方程等。 ##### 2.1 线性方程求解 对于线性方程组 \( Ax = b \),MATLAB 提供了直接法(如矩阵左除 `\`)和迭代法(如 `pcg`)。例如,求解以下方程组: \[ \begin{cases} 2x + y = 5 \\ x - y = 1 \end{cases} \] 可以使用以下代码: ```matlab A = [2, 1; 1, -1]; b = [5; 1]; x = A \ b; disp(x); % 输出 [2; 1] ``` ##### 2.2 非线性方程求解 对于非线性方程方程组,MATLAB 提供了 `fsolve` 函数,它基于优化算法求解问题[^3]。例如,求解方程 \( x^2 - 4 = 0 \): ```matlab function F = myEquation(x) F = x^2 - 4; end x0 = 1; % 初始猜测值 x = fsolve(@myEquation, x0); fprintf('解为: %f\n', x); % 输出 2.000000 ``` ##### 2.3 微分方程求解 MATLAB 的 `ode45` 是一种常用的常微分方程(ODE)求解器。例如,求解初值问题 \( \frac{dy}{dt} = -y \),\( y(0) = 1 \): ```matlab function dydt = myODE(t, y) dydt = -y; end tspan = [0, 5]; % 时间范围 y0 = 1; % 初始条件 [t, y] = ode45(@myODE, tspan, y0); plot(t, y); ``` #### 3. MATLAB 函数方程的对比 MATLAB 和其他编程语言(如 Python 的 NumPy 库)在处理函数方程时存在一些差异[^2]。例如: - MATLAB 更适合矩阵运算和科学计算,而 NumPy 在数组操作方面更加灵活。 - MATLAB函数定义方式更接近于传统的数学表达式,而 NumPy 倾向于使用矢量化操作。 #### 4. 总结 MATLAB 提供了丰富的工具和函数库,能够高效地解决各类数学问题。无论是线性方程组、非线性方程还是微分方程MATLAB 都能提供相应的解决方案。通过掌握 MATLAB函数定义和方程求解方法,用户可以更好地应对实际工程和科研中的挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值