美文网首页
1.线性拟合和牛顿迭代求根,以及牛顿迭代法的多元表达雅可比矩阵

1.线性拟合和牛顿迭代求根,以及牛顿迭代法的多元表达雅可比矩阵

作者: 光能蜗牛 | 来源:发表于2022-09-02 20:50 被阅读0次

    线性拟合

    我们知道函数f(x)x=a处的导数的定义是类似如下

    f'(a)=\lim_{x\rightarrow a}\frac{f(x)-f(a)}{x-a}

    也就是说在自变量x趋近于a的时候,函数值变化量和自变量变换量的比值

    我们把极限符号去掉 f'(a) \approx\frac{f(x)-f(a)}{x-a},这个约等于在x越接近a(注:x\neq a)的时候越接近等号

    基于上述的理论,因为我们最终想要得到的是f(x)的表达式,
    因此上面稍作变形得到

    f(x) \approx f(a)+f'(a)(x-a)

    该等式叫做一种对原函数f(x)一阶线性拟合

    如果熟悉泰勒展开的话,会发现这个等式刚好是泰勒公式的一阶展开
    稍提一下,泰勒在x=a处的完全展开式(即N阶展开)
    f(x)=f(a)+f'(a)(x-a)+\frac{1}{2}f''(a)(x-a)^2+\frac{1}{3!}f''(a)(x-a)^3+...

    这里用线性拟合的方式做一下练习:
    假设有函数f(x)=x^{\frac{1}{2}},要求f(9.06)=9.06^{\frac{1}{2}}的大概值

    根据等式f(x) \approx f(a)+f'(a)(x-a)
    我们知道离自变量9.06比较接近且较容易计算的一个点是9,于是选一个点令 a=9来近似拟合
    于是f(9.06) \approx f(9)+f'(9)(9.06-9) = 3+\frac{1}{6}*0.06=3.01
    如果想再进一步拟合
    可以令a=3.01^2
    于是f(9.06) \approx f(3.01^2)+f'(3.01^2)(9.06-3.01^2) = 3.01+\frac{1}{6.02}*(9.06-9.0601)=3.009983388704
    到这一步基本上误差很小了,精确度已经到小数点后四位,一般近似解完全够了,基本不需要再进行拟合,当然你可以看到,即使再进行计算,整个程序的流程都非常快

    接下来说牛顿迭代的思路

    牛顿迭代

    f(x) \approx f(a)+f'(a)(x-a)
    还是上面的等式,但是牛顿的思路是这样的:
    我们注意到一般来说f(x)是一个表达式,而这个解析式的函数值是变化的
    如果要求函数f(x)x轴的交点,说白了就是求f(x)=0得满足条件的x的取值
    于是牛顿说,我构造一个函数表达式f(x),令其等于0,然后反过来迭代求x的值

    0=f(x) \approx f(a)+f'(a)(x-a)
    0 \approx f(a)+f'(a)(x-a)
    x\approx a-\frac{f(a)}{f'(a)}

    其实这相当于每次都让当前函数值和目标0值作差,同时计算当前迭代所在x的梯度值,并根据梯度方向进行下降

    还是上面的题目有函数f(x)=x^{\frac{1}{2}},要求f(9.06)=9.06^{\frac{1}{2}}的大概值

    牛顿迭代是怎么做的呢,由上面的等式可构造F(x)=x^2-9.06=0
    同样我们选定a=3
    此时迭代式x\approx a-\frac{F(a)}{F'(a)}
    x\approx 3-\frac{F(3)}{F'(3)}=3-\frac{-0.06}{2*3}=3.01
    此时选择a=3.01作为下一轮的迭代
    x\approx 3.01-\frac{F(3.01)}{F'(3.01)}=3.01-\frac{0.0001}{2*3.01}=3.009983388704

    可以看到,线性拟合和牛顿迭代本质上没什么区别,不同的是,牛顿迭代需要构造一个F(x)=0的新函数去迭代求解,这一点要特别注意

    牛顿迭代的通式为
    x_{n+1}\approx x_n-\frac{F(x_n)}{F'(x_n)}

    牛顿迭代的多元情况,和雅可比矩阵

    根据线性拟合 f(x) \approx f(x_0)+f'(x_0)(x-x_0)

    多元函数的时候,拟合应该变成
    f(x,y) \approx f(x_0,y_0)+\frac{\partial f(x_0,y_0)}{\partial x}(x-x_0) +\frac{\partial f(x_0,y_0)}{\partial y}(y-y_0)
    也就说,这里变成两个变量的话,是需要从两个方向去近似拟合,不理解的可以仿照一维的情况在书本上画一画,或者后续我补一张图,这里看不懂后续更看不懂了

    因为牛顿迭代求根,因此令左边为零
    f(x,y) \approx f(x_0,y_0)+\frac{\partial f(x_0,y_0)}{\partial x}(x-x_0) +\frac{\partial f(x_0,y_0)}{\partial y}(y-y_0)
    写成矩阵形式

    f(x,y) \approx f(x_0,y_0)+\begin{bmatrix}\frac{\partial f(x_0,y_0)}{\partial x}&\frac{\partial f(x_0,y_0)}{\partial y}\end{bmatrix}\begin{bmatrix}(x-x_0) \\(y-y_0)\end{bmatrix}
    这个式子习惯上会写成
    f(X)=f(X_0)+J(X_0)^T\Delta X,多元函数的一阶泰勒展开

    令左边等于0,于是迭代式
    \begin{bmatrix}(x-x_0) \\(y-y_0)\end{bmatrix} \approx -\begin{bmatrix}\frac{\partial f(x_0,y_0)}{\partial x}&\frac{\partial f(x_0,y_0)}{\partial y}\end{bmatrix}^{-1} f(x_0,y_0) (注:这里前面那个矩阵是不可逆的,只是一种符号语言,实际计算的时候还是写开比较好)
    \begin{bmatrix}x \\y\end{bmatrix} \approx \begin{bmatrix}x_0 \\y_0\end{bmatrix} -\begin{bmatrix}\frac{\partial f(x_0,y_0)}{\partial x}&\frac{\partial f(x_0,y_0)}{\partial y}\end{bmatrix}^{-1} f(x_0,y_0)
    多元函数迭代式这个形式和上面的一元迭代式基本一样
    这里是长这个样子X_{n+1}\approx X_n-F'(x_n)^{-1}F(x_n) , X 为多元列向量

    我们把这里的F'(x_n)=\begin{bmatrix}\frac{\partial f(x_0,y_0)}{\partial x}&\frac{\partial f(x_0,y_0)}{\partial y}\end{bmatrix} 叫做雅可比矩阵

    你可能会说,究竟啥玩意要整这么一大坨坨,ok,接下来放个题目

    \begin{equation} \left\{ \begin{array}{lr} x_1^2-x_2-1=0\\ (x_1-2)^2+(x_2-0.5)^2-1=0 \end{array} \right. \end{equation}

    image.png
    图示大概长这样,一个简单的多元非线性方程组的求解问题,也就是说,不同的是,这里是两个多元函数,即求解的是两条曲线的交点问题,
    可以看到这里出现了多元x_1,x_2,同时出现了两个方程,
    在开始之前,我们仿照上面单个方程的写法,来分别写两个函数 ,比如函数f_1,f_2

    f_1(x,y) \approx f_1(x_0,y_0)+\frac{\partial f_1(x_0,y_0)}{\partial x}(x-x_0) +\frac{\partial f_1(x_0,y_0)}{\partial y}(y-y_0)
    f_2(x,y) \approx f_2(x_0,y_0)+\frac{\partial f_2(x_0,y_0)}{\partial x}(x-x_0) +\frac{\partial f_2(x_0,y_0)}{\partial y}(y-y_0)
    同样的,对于牛顿迭代而言,令左边等式为零于是得到

    f_1(x_0,y_0)+\frac{\partial f_1(x_0,y_0)}{\partial x}(x-x_0) +\frac{\partial f_1(x_0,y_0)}{\partial y}(y-y_0)=0
    f_2(x_0,y_0)+\frac{\partial f_2(x_0,y_0)}{\partial x}(x-x_0) +\frac{\partial f_2(x_0,y_0)}{\partial y}(y-y_0)=0

    如果写成矩阵形式,则有
    \begin{bmatrix}f_1(x_0,y_0)\\f_2(x_0,y_0)\end{bmatrix}+\begin{bmatrix}\frac{\partial f_1(x_0,y_0)}{\partial x}&\frac{\partial f_1(x_0,y_0)}{\partial y}\\\frac{\partial f_2(x_0,y_0)}{\partial x}&\frac{\partial f_2(x_0,y_0)}{\partial y}\end{bmatrix}\begin{bmatrix}x-x_0\\y-y_0\end{bmatrix}=0

    \Rightarrow

    \begin{bmatrix}\frac{\partial f_1(x_0,y_0)}{\partial x}&\frac{\partial f_1(x_0,y_0)}{\partial y}\\\frac{\partial f_2(x_0,y_0)}{\partial x}&\frac{\partial f_2(x_0,y_0)}{\partial y}\end{bmatrix}\begin{bmatrix}x-x_0\\y-y_0\end{bmatrix}=-\begin{bmatrix}f_1(x_0,y_0)\\f_2(x_0,y_0)\end{bmatrix}
    \Rightarrow

    \begin{bmatrix}x-x_0\\y-y_0\end{bmatrix}=-\begin{bmatrix}\frac{\partial f_1(x_0,y_0)}{\partial x}&\frac{\partial f_1(x_0,y_0)}{\partial y}\\\frac{\partial f_2(x_0,y_0)}{\partial x}&\frac{\partial f_2(x_0,y_0)}{\partial y}\end{bmatrix}^{-1}\begin{bmatrix}f_1(x_0,y_0)\\f_2(x_0,y_0)\end{bmatrix}

    \Rightarrow

    \begin{bmatrix}x\\y\end{bmatrix}=\begin{bmatrix}x_0\\y_0\end{bmatrix}-\begin{bmatrix}\frac{\partial f_1(x_0,y_0)}{\partial x}&\frac{\partial f_1(x_0,y_0)}{\partial y}\\\frac{\partial f_2(x_0,y_0)}{\partial x}&\frac{\partial f_2(x_0,y_0)}{\partial y}\end{bmatrix}^{-1}\begin{bmatrix}f_1(x_0,y_0)\\f_2(x_0,y_0)\end{bmatrix}

    \begin{bmatrix}x_{n+1}\\y_{n+1}\end{bmatrix}=\begin{bmatrix}x_n\\y_n\end{bmatrix}-\begin{bmatrix}\frac{\partial f_1(x_n,y_n)}{\partial x}&\frac{\partial f_1(x_n,y_n)}{\partial y}\\\frac{\partial f_2(x_n,y_n)}{\partial x}&\frac{\partial f_2(x_n,y_n)}{\partial y}\end{bmatrix}^{-1}\begin{bmatrix}f_1(x_n,y_n)\\f_2(x_n,y_n)\end{bmatrix}

    上面我们为了推导方便把多元变量用x,y来表示
    在实际的操作中(比如上面的题目)一般习惯用x_1,x_2,...,x_n来表示多元变量,同时使用上标来表示迭代次数如x_1^k,x_1^{k+1},分别指代变量x_1的第k次迭代和第k+1次迭代
    那么我们可以将上面的等式改写一下,变量从x,y改到x_1,x_2,迭代次数从下标n换到上标k

    \begin{bmatrix}x_1^{k+1}\\x_2^{k+1}\end{bmatrix}=\begin{bmatrix}x_1^k\\x_2^k\end{bmatrix}-\begin{bmatrix}\frac{\partial f_1(x_1^k,x_2^k)}{\partial x_1}&\frac{\partial f_1(x_1^k,x_2^k)}{\partial x_2}\\\frac{\partial f_2(x_1^k,x_2^k)}{\partial x_1}&\frac{\partial f_2(x_1^k,x_2^k)}{\partial x_2}\end{bmatrix}^{-1}\begin{bmatrix}f_1(x_1^k,x_2^k)\\f_2(x_1^k,x_2^k)\end{bmatrix}
    简化一下写成
    X^{k+1}=X^k-F'(X^k)^{-1}F(X^k)

    其中,这里的雅可比矩阵就是F'(X^k)=\begin{bmatrix}\frac{\partial f_1(x_1^k,x_2^k)}{\partial x_1}&\frac{\partial f_1(x_1^k,x_2^k)}{\partial x_2}\\\frac{\partial f_2(x_1^k,x_2^k)}{\partial x_1}&\frac{\partial f_2(x_1^k,x_2^k)}{\partial x_2}\end{bmatrix}

    那么根据上面的推论,我们可以直接写出求根迭代式

    \begin{bmatrix}x_1^{k+1}\\x_2^{k+1}\end{bmatrix}=\begin{bmatrix}x_1^k\\x_2^k\end{bmatrix}-\begin{bmatrix}2x_1^k&-1\\2(x_1^k-2)&2(x_2^k-0.5)\end{bmatrix}^{-1}\begin{bmatrix}(x_1^k)^2-x_2^k-1\\(x_1^k-2)^2+(x_2^k-0.5)^2-1\end{bmatrix}

    注意,上面的x_1^kx_2^k中的k是指的第k次迭代的意思,并不是指的k次方,实际编程或计算可以用别的变量命名以防被自己误导

    可见使用牛顿迭代的方式求根只跟原曲线函数以及其对应的雅可比矩阵相关

    总结一下

    类比单个函数求根的泰勒一阶展开
    f(x_{(k+1)})=f(x_k)+f'(x_k)\Delta x

    n个多元函数求根的问题具有类似的如下泰勒展开等式
    F(X^{(k+1)})=F(X^{(k)})+J(X^{(k)})^{T}\Delta X
    此时令F(X^{(k+1)})=0
    可得出迭代式增量为
    \Delta X=-J(X^{(k)})^{-T}F(X^{(k)})

    相关文章

      网友评论

          本文标题:1.线性拟合和牛顿迭代求根,以及牛顿迭代法的多元表达雅可比矩阵

          本文链接:https://www.haomeiwen.com/subject/ubajnrtx.html