B站台湾大学郭彦甫|MATLAB 学习笔记|11 方程式求根 Root_Finding

MATLAB学习笔记(11 方程式求根 Root_Finding)

1. 提出问题

假设现在有一个数学函数 f(x)=x22x8,需要找到一个点 x0,使得 f(x0)=0,使用 MATLAB 来解决这个问题:

  • 求函数的解析解
  • 使用图像来表达
  • 数值方法求解

2. 找符号形式的根

2.1 使用 solve() 找符号形式的根 (Symbolic approach)

syms x	% 创建symbols的意思
y = x*sin(x)-x;
solve(y, x) % slove(y,x)中y表示equation,x表示variable,默认等式y=0
>> Class11
 
ans =
 
   0
pi/2

2.2 求方程组

用符号方式求下列方程组:

{x2y=5x+y=6

syms x y
eq1 = x - 2*y - 5;
eq2 = x + y - 6;
A = solve(eq1,eq2,x,y)

exercise (P7)

题目 1:

使用符号方式求解下列等式对 x 的解:

(xa)2+(yb)2=r2

解 1:

%% 题目1
clear
clc
syms x y a b r
f = (x-a)^2 + (y-b)^2 - r^2;
solve(f,x) 
ans =
 
a + (b + r - y)^(1/2)*(r - b + y)^(1/2)
a - (b + r - y)^(1/2)*(r - b + y)^(1/2)

题目 2:

使用符号方式求解矩阵的逆:

A=[abcd]

解 2

%% 题目2
clear
clc
syms a b c d 
A = [a b; c d];
inv(A)  % 对A求逆
ans =
 
[ d/(a*d - b*c), -b/(a*d - b*c)]
[-c/(a*d - b*c),  a/(a*d - b*c)]

2.3 求差分:diff() (得到符号形式结果)

example:

计算下列函数的导数:

y=4x5

syms x
y = 4*x^5;
yprime = diff(y)	%yprime 表示y的导数

exercise (P8)

题目:

(1)f(x)=ex2x3x+3,   dfdx=?(2)g(x)=x2+xy+1y3+x+3,  gx=?(PPT上输错了)

解:

clear
clc
syms x y
f = (exp(x^2))/(x^3-x+3);
g = (x^2+x*y+1)/(y^3+x+3);
diff(f,x)
diff(g,x) 
ans =
 
(2*x*exp(x^2))/(x^3 - x + 3) - (exp(x^2)*(3*x^2 - 1))/(x^3 - x + 3)^2
 
 
ans =
 
(2*x + y)/(y^3 + x + 3) - (x^2 + y*x + 1)/(y^3 + x + 3)^2

2.4 符号积分

example:

计算以下函数的积分:

z=ydx=x2exdx,  且满足z(0)=0

y 直接积分得到 z=ex(x22x+2),此时的 z(0)=2,为使得 z(0)=0,因此(我们所需要的) z = (现在求得的) z - 2

syms x; 
y = x^2*exp(x);
z = int(y); 
z = z-subs(z, x, 0);
% subs(s,old,new)返回s的副本,其中所有出现的old将会被new取代。

exercise (P9)

题目:

计算:

010x2x+1x+3dx

解:

clear
clc
syms x 
y = (x^2-x+1)/(x+3);
F = int(y,x,0,10)
 
F =
 
log(302875106592253/1594323) + 10

3. 找数值形式的根 (Numerical approach)

3.1 使用 fsolve() 求根

example:

计算:

f(x)=1.2x+0.3+xsin(x)

f2 = @(x) (1.2*x+0.3+x*sin(x));
fsolve(f2,0)    % f2是句柄,0是计算初始值

exercise (P14)

题目:

找到下面方程组的根:

f(x,y)={2xyexx+2yey

初始值 (x,y)=(5,5)

解:

clear
clc

fun = @eqas;
x0 = [-5 -5];
answer = fsolve(fun,x0)

function F = eqas(x0) 
% 在eqas的输入为1个数组时才能计算出来,还需要注意F
x = x0(1); y = x0(2);
F(1) = 2*x-y-exp(-x);
F(2) = -x+2*y-exp(-y);
end


answer =

    0.5671    0.5671

3.2 使用 fzero()

example:

计算:y=x2 的根

%方法1
f=@(x)x.^2;
fzero(f,0.1)	%fzero()必须保证函数经过x轴,才能算出来

fsolve(f,0);	%作为对比
ans =

   NaN
   
ans =

     0

%方法2
f=@(x)x.^2
options=optimset('MaxIter',1e3,'TolFun',1e-10);
%1e3表示迭代次数(1000),1e-10表示误差
fsolve(f,0.1,options)
fzero(f,0.1,options)

f =

  包含以下值的 function_handle:

    @(x)x.^2


Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>

ans =

   1.9532e-04

正在退出 fzero: 将终止搜索包含符号变化的区间
 因为在搜索期间遇到 NaN 或 Inf 函数值。
(-1.37296e+154 处的函数值为 Inf。)
请检查函数或使用其他起始值重试。

ans =

   NaN

3.3 求多项式的根: roots()

example:

找到下面多项式的根:

f(x)=x53.5x4+2.75x3+2.125x23.875x+1.25

roots([1 -3.5 2.75 2.125 -3.875 1.25])

ans =

   2.0000 + 0.0000i
  -1.0000 + 0.0000i
   1.0000 + 0.5000i
   1.0000 - 0.5000i
   0.5000 + 0.0000i

3.4 数值寻根方法进阶

以数值的方式寻根, 其方法可分为两种主要类型:

  1. Bracketing methods (交叉法)

    从一个包含根的区间开始, 例如 bisection method (二分法)

  2. Open methods (开型法)

    从一个或多个初始预测点开始, 例如 Newton-Raphson method (牛顿-拉普森方法)

寻根将会迭代进行,直到满足某些标准:精度或者迭代次数

3.4.1 二分法 (Bisection method)

  • 假设条件

    • f(x)[l,u] 上连续
    • f(l)f(u)<0
  • 算法

将空间分成一半,判断两段端点的函数值的积的正负,选择函数积为负的一半空间继续使用二分法

Loop

  1. r=(l+u)/2(找中点)

  2. 如果 f(r)f(u)<0,确定新的间隔 [r,u]

    如果 f(l)f(u)<0,确定新的间隔 [l,r]

End

  • 二分法算法流程图

3.4.2 牛顿-拉普森方法 (Newton-Raphson method)

  • 假设条件

    • f(x) 连续
    • f(x) 已知
  • 算法

根据已知的一个点的 x0,f(x0),f(x0) 找到斜率的延长线与 X 轴的交点 x1,作为新的计算点,以此进行迭代计算

f(x0)x0x1=f(x0)x1=x0f(x0)f(x0)   (根据x0,f(x0),f(x0) 来求x1)

Loop

   xn+1=xnf(xn)f(xn)

End

  • 算法流程图

4. 递归方法求根

4.1 介绍递归函数

函数可以自己调用自己

example:

函数如下:(以阶乘递归函数为例)

n!=n×(n1)!=n×(n1)×(n2)!=n×(n1)×(n2)×(n3)!=n×(n1)×(n2)×

function output = fact(n)
% fact recursively finds n!
if n==1
output = 1;
else
output = n * fact(n-1);
end
end

该函数包括一个递归情况和一个基数情况,当函数到达基数情况时停止

posted @   一抹微瀾  阅读(462)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示