方程求解与最优化

非线性方程(组)的求解


solve()

solve()可以求解代数方程和超越方程
标准格式: S = solve(eqn,var),可选参数 Name,Value
example

solx =

pi/2


求解方程组的话
标准格式: [y1,...,yN] = solve(eqns,vars),可选参数 Name,Value
example

solv =

1/3 – (2^(1/2)*1i)/3
(2^(1/2)*1i)/3 + 1/3

solu =

– (2^(1/2)*1i)/3 – 2/3
(2^(1/2)*1i)/3 – 2/3


嗯,这个函数看起来强的一点道理都不讲,但其实你用多了就会发现还是有很多坑的。
举个简单的例子

S =
u: [1×1 sym]
v: [1×1 sym]

有些小伙伴在这里就懵逼了,这里的显示是由于solve()在处理多元方程的时候会以结构体形式返回结果。
你只需要

ans =
1/3
ans =
-2/3


除此之外,还有这种操作

ans =
Empty sym: 0-by-1

出现这种结果有两种情况,一种是无解,还有一种是可能有解,但solve()找不出来。一般来说第二种情况下MATLAB给返回一个warning。
solve()还有很多的衍生函数,不赘述。

roots()

roots()可以求多项式方程的解
标准格式: r = roots(p)
其中,P是存放多项式系数的一维数组
比如p = [3 2 -2]就代表了多项式方程3x^2 + 2x - 2 = 0
example

r =

1.5352
-0.8685

虽然roots()只能解多项式方程,但这个函数返回的结果是在复数域内的!
比如下例

r =

-1.0000 + 0.0000i
0.0000 + 1.0000i
0.0000 – 1.0000i
1.0000 + 0.0000i

这个特性虽然很强,但有些时候也带来一些麻烦。
所以你需要real()和imag(),它们可以分别取出参数的实部和虚部

fzero()

fzero()可以求多项式方程的一个解
标准格式: x = fzero(fun,x0),可选参数为options
其中x0是估计的解,函数优先在x0附近搜索
x0也可替换为一段区间

example

x =

3.1416


fsolve()

fsolve()可以求多项式方程的数值解
标准格式: x = fsolve(fun,x0),可选参数为options
其中x0是估计的解,函数优先在x0附近搜索
x0也可替换为一段区间

example:求解方程组
e^{-e^{-x_1 + x_2}} - x_2 (1 + x_1^2) = 0
x_1 cosx_2 + x_2sinx_1 - 0.5 = 0
function:

code

Equation solved.

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

x =

0.3931 0.3366

就算是这种变态的方程组,只要是数值解fsolve()就能怼出来,强无敌。


极值问题

以下所有实例以极小值为例


有约束区间

此类问题使用fminbnd()
标准格式: x = fminbnd(fun,x1,x2),可选参数为options
其中x1,x2为区间的下界和上界


有约束表达式

此类问题使用fmincon()
标准格式: x = fmincon(fun,x0,A,b),可选参数非常多
函数从x0附近开始搜索,后面一大堆参数都是限制条件相关
针对不同形式的限制条件,这个函数的重载也非常复杂,具体请参阅文档。


无约束

此类问题使用fminsearch()
标准格式: x = fminsearch(fun,x0),可选参数为options
函数从x0附近开始搜索。


线性规划

线性规划求最大值的模型一般由MATLAB中linprog()求解,其使用方法和fmincon()非常非常像。
具体实例请参见教材P173


曲线拟合


多项式拟合使用ployfit()
标准格式: p = polyfit(x,y,n)
x, y为数据,n为拟合阶数(多项式最高次)
返回幂次向量p

多项式拟合使用ployfit()
标准格式: y = polyval(p,x)
p为幂次向量,x是自变量,返回函数值

example

result
matlab_ployfitandval


非线性方程求根方法

二分法

不动点迭代

牛顿迭代

通过把原式做一阶泰勒展开,移项后可以得到迭代公式,可以随便估一个解扔进去跑。