记忆力比较差,把学习过程中常用的语法记录于此,方便回忆时索引
MATLAB总结3:方程求解
文章目录
一、fzero 、root 求根
1.fzero
fzero 用于求解非线性方程的根。它的语法是:
x = fzero(fun, x0)
x = fzero(fun, x0, options)
其中:
fun 是一个函数句柄,表示要求解根的目标函数。这个函数应该接受一个输入参数,并返回一个标量值。
x0 是初始猜测的根的值。
options 是一个可选的参数结构体,用于指定额外的求根选项。
fzero 函数使用的是迭代算法,它会尝试找到函数 fun 的根。输出变量 x 是找到的根的近似值。
function xp=solve
fun=@(x) 2*x^3-3*x^2+4*x-5;
z=fzero(fun,1);
xp=z;
x=-1:0.01:3;
y=2.*x.^3-3.*x.^2+4.*x-5;
plot(x,y);
grid on;
2.roots
root 函数用于计算多项式方程的根。给定多项式的系数向量,root 函数返回一个列向量,其中包含多项式的所有根。
root 函数的基本语法如下:
r = roots( p )
其中,p 是一个包含多项式的系数的向量,从高次到低次排列。r 是一个列向量,包含多项式的所有根。
以下是一个简单的示例,展示如何使用 root 函数计算多项式的根:
定义一个多项式 p(x) = x^2 - 3x + 2
% 定义多项式的系数
p = [1, -3, 2];
% 使用 root 计算根
r = roots(p);
% 显示结果
disp('多项式的根:');
disp(r);
需要注意的是,roots 函数返回的根是复数形式的,即使多项式的系数都是实数。如果多项式有重复的根,它们可能会以多次出现在结果中。此外,对于高次多项式,根的计算可能耗时较长。
二、ode23,ode45 与 Euler 方法
1.ode23,ode45
ode23和ode45是用于求解常微分方程(ODE)的数值方法。
ode23:它是一种变步长、二阶(三阶)龙格-库塔方法。它使用二阶精确的公式进行时间积分,并具有三阶精确的误差估计。ode23适用于中度刚性的ODE,即既非高度刚性也非高度非刚性的情况。
ode45:它是一种变步长、四阶(五阶)龙格-库塔方法。它使用四阶精确的公式进行时间积分,并具有五阶精确的误差估计。
下面是一个简单的示例代码,展示如何使用 ode23 求解一个简单的线性常微分方程:
% 定义ODE函数
function dydt = odefun(t, y)
dydt = -0.5 * y;
end
% 设置初始条件
t0 = 0;
y0 = 1;
% 设置求解选项
tspan = [0 10];
% 调用求解器 ode23
[t, y] = ode23(@odefun, tspan, y0);
% 显示结果
plot(t, y);
xlabel('时间');
ylabel('状态变量');
title('ODE23求解结果');
同样的代码也可以用于 ode45,只需将函数调用中的 ode23 替换为 ode45 即可。
对于高阶的导数可以使用多变量定义的方式
function r = myfun
x1 = 0:0.1:100;%定义范围
x0 = [2; 0]; %定义初始条件
[t, x] = ode23(@myode, x1, x0);%这里的x是一个向量
plot(t, x(:, 1));
end
function dxdt = myode(t, x)
dxdt = [20*(1-x(1)^2)*x(2) + 0.5*x(1); 0];%x(1)代表x,x(2)代表dx/dt
end
2.Euler
欧拉法(Euler’s method)是一种简单的数值逼近方法,也用于求解常微分方程(ODE)。它基于离散化时间的思想,将连续的时间区间划分为一系列离散的时间步长,并在每个时间步长上进行逼近。
以下是欧拉法的基本步骤:
定义ODE:给定一个常微分方程 dy/dt = f(t, y),其中 t 是时间,y 是状态变量,f(t, y) 是导数函数。
设置初始条件:指定初始时间 t0 和初始状态变量 y0。
设置步长和时间间隔:选择一个合适的时间步长 Δt,以及求解的时间范围。
迭代逼近:使用欧拉法进行迭代逼近。在每个时间步长上,根据当前时间和状态变量的值,使用导数函数计算出斜率值。然后,使用斜率乘以时间步长 Δt,得到在该时间步长上的状态变量的变化量。最后,将该变化量加到当前状态变量的值上,得到下一个时间步长上的状态变量的近似值。
重复步骤 4 直到达到所需的时间范围。
欧拉法的数学表达式如下:
y_(n+1) = y_n + f(t_n, y_n) * Δt
其中,y_n 是当前时间步长上的状态变量的值,y_(n+1) 是下一个时间步长上的状态变量的近似值,f(t_n, y_n) 是在当前时间步长上的斜率值,Δt 是时间步长。
三、dsolve、fsolve
1.dsolve
dsolve 用于求解符号常微分方程(Symbolic Ordinary Differential Equations)的函数。
它可以求解一阶或高阶常微分方程,包括线性和非线性的情况。
Y = dsolve(‘eq1,eq2,…’ , ’cond1,cond2,…’ , ’Name’)
% 定义符号变量
syms t y(t)
% 定义常微分方程
ode = diff(y(t), t) == -2 * y(t);
% 求解
sol = dsolve(ode);
% 显示解析解
sol
结果
sol =
C1*exp(-2*t)
2.fsolve
fsolve 函数用于求解非线性方程组。
给定一个或多个非线性方程和初始猜测值,fsolve 函数使用数值方法找到使方程组等式成立的未知变量的数值解。它通过迭代的方式逐步优化解的精度,直到满足设定的收敛条件。 例如,假设要求解一个非线性方程组:
求解:
function F = root2d(x)
F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;
从 [0,0] 点开始求解方程组。
fun = @root2d;
x0 = [0,0];
x = fsolve(fun,x0)
四、inline
在早期版本的 MATLAB 中,使用 inline 函数可以创建一个内联函数(inline function),它可以将表达式转换为可执行的函数对象。然而,在 MATLAB R2016b 版本之后,inline 函数被废弃,不再推荐使用。
相反,推荐使用匿名函数(anonymous function)来代替 inline 函数。匿名函数的语法更简洁,并提供了更强大的功能。
下面是一个使用 inline 函数创建内联函数的示例:
f = inline('x^2 + sin(x)', 'x');
通过这种方式,我们可以将表达式转换为一个可以接受输入并计算输出的函数对象。
然而,新版本推荐使用匿名函数来代替 inline 函数。匿名函数的语法如下:
f = @(x) x^2 + sin(x);
上述匿名函数的语法更简洁,直接将表达式和输入变量放在 @(x) 中,省去了使用 inline 函数的步骤。