MATLAB常用语句总结3

记忆力比较差,把学习过程中常用的语法记录于此,方便回忆时索引

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 函数的步骤。

  • 26
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值