简介
Today:
•Symbolic approach 利用符号的方式求根
•Numeric root solvers 利用数值方式求根
•Recursive functions 递归
Symbolic Root Finding Approach 符号寻根
syms x %定义x为 “symbolic variables”
Symbolic Root Finding: solve() 求根
在命令行窗口输入第一组代码会得到
在命令行窗口输入第二组代码
下面是两个练习
Symbolic Differentiation: diff() 求导/微分
输入代码
syms x
y = 4*x^5;
yprime = diff(y)
结果
练习
代码
syms x
y=exp(x^2)/(x^3-x+3);
yprime=diff(y)
结果
练习
代码
syms x y
>> g=(x^2+x*y-1)/(y^3+x+3);
>> gprime=diff(g)
运行结果
Symbolic Integration: int() 积分
代码
syms x;
y=x^2*exp(x);
z=int(y);
z=z-subs(z,x,0)
结果
输入前三行代码得到的结果如下
此时将x=0带入z得z=2,与初始值不符合,所以增加最后一行代码,以符合题设所给条件。
练习
代码
syms x
int((x^2-x+1)/(x+3),0,10)
Symbolic vs. Numeric 符号和数值寻根的比较
接下来再一次复习Handles(@),上次课已经复习过,可能是因为比较重要
Review of Function Handles (@)
fsolve() 求根
因为不知道解是多少,所以给了0一个猜测值,使得结果向猜想点处收敛
初始值不同可能会对结果有影响,比如方程有很多个零解,那么给不同的初值可能会收敛到其它解去
运行结果
练习
代码
equ=@(x)[2*x(1)-x(2)-exp(-x(1));-x(1)+2*x(2)-exp(-x(2))];
x=fsolve(equ,[-5,-5])
结果
fsolve只能一个变量,但是可以用一个变量的向量组
fzero()求根
fzero在使用时,函数穿过x轴才有效果,否则算不出来结果。fsolve则没有这种限制。
输入上面代码进行验证
验证fzero
验证fsolve
但是,此时显然这个结果的精度过低
所以,我们需要将进行
一些高级操作
例如
可以设置,迭代次数和精度
代码
f=@(x)x.^2;
options=optimset('Maxiter',1e3,'TolFun',1e-10);
>> fsolve(f,0.1,options)
结果
Finding Roots of Polynomials:roots() 求根
roots仅仅是用来解决多项式问题的
代码
roots([1 -3.5 2.75 2.125 -3.875 1.25])
运行结果
练习
代码
roots([1 -6 -12 81])
运行结果
Numeric Root Finding Methods 数值寻根
数值寻根的两种方式
二分法(需要在一个区间内)
牛顿法-梯度下降法(需要求得导数)
Bisection Method (Bracketing) 二分法
对应流程图
Newton-Raphson Method (Open)牛顿法
对应流程图
Bisection vs. Newton-Raphson 两种方法比较
Recursive Functions 递归函数
Factorial Recursive Function
•
The function includes a recursive case and a base case
•
The function stops when it reaches the base case
代码
function output = fact(n) % fact recursively finds n!
if n==1
output = 1;
else
output = n * fact(n-1);
end
end
以上这两种方法在最优化中都有学习