精华内容
下载资源
问答
  • 不动点迭代法求方程根

    千次阅读 2019-03-05 10:40:25
    反之亦然,我们称为函数的一个不动点f(x)的零点就等价于g(x)的不动点,选择一个初始近似值,将其带入右端,即,反复迭代之后得到,g(x)称为迭代函数,而且当k->∞, 例题: 求方程在附近的 x=1.5;...

    不动点

    f(x)=0可以改写成等价的形式x=g(x)。若x^{*}满足f(x^{*})=0,则x^{*}=g(x^{*}).反之亦然,我们称x^{*}为函数f(x)的一个不动点,求f(x)的零点就等价于求g(x)的不动点,选择一个初始近似值x^{0},将其带入右端,即x^{1}=g(x^{0}),反复迭代之后得到
    x^{k+1}=g(x^{k}),g(x)称为迭代函数,而且当k->∞,x^{k}=x^{*}

    例题:

    求方程 f(x)=x^{3}-x-1=0x^{0}=1.5附近的根

    x=1.5;
    for i=1:10
        x=(x+1)^(1/3);
    end
    x

    当我们用上面的方法可以求出x=1.3247,但是我们用x=x^{3}-1却求不出,这是为什么呢?

    其实是因为这个迭代是不收敛的,发散的。

     

    展开全文
  • 不动点迭代法求方程(Python实现)不动点迭代法求方程:是迭代法解方程当中经典的方法。将求解f(x) = 0的问题变成x = h(x)这样的问题。转变的方程很简单,一般是移项,平方,开根号什么的。难点: 问题...

    不动点迭代法求方程的根(Python实现)

    不动点迭代法求方程的根:是迭代法解方程的根当中经典的方法。

    将求解f(x) = 0的问题变成x = h(x)这样的问题。

    转变的方程很简单,一般是移项,平方,开根号什么的。

    难点: 问题难点就得到的对应不动点迭代方程是否收敛上。

    因为对于一个方程来说,对应的不动点迭代方程会有很多种的。

    而收敛性的考究,最为经典的定理有两个。

    全局上的一个定理: 这个定理就是在全局上使用的。具体内容如下:

    当h(x)这个方程在对应的区间上是闭区间连续函数。同时,需要满足压缩性跟封闭性。

    封闭性:就是指在某个区间上的任意一个值,代入对应的函数中,得到的函数值也会一定在这个区间上的。

    压缩性:就是指,存在一个小于大于0的常数,使得在对应的区间上,任意两点之间的函数值之差的绝对值都是小于这个常数乘上对应两点间距离之差。

    压缩这个名字,可以体现在迭代的过程中迭代距离不断缩短的特点,这一点也保证了收敛到后期必定会收敛到特定的点。

    局部上的一个定理:这里所说的局部,就是指在不动点周围的一个区间。(也可以说是邻域)。

    这里说是不动点上的h(x) 的导数的绝对值必须要小于1,那么就有一个局部可以实现收敛。

    这个定理的证明,需要用到拉格朗日中值定理,然后两行就可以写完了。

    代码

    下面中

    func 就是 h(x) begin跟end,就是规定的区间 MAXSTEP表示迭代的最高步数。 x0是设置的初始值(用随机数生成) temp是用于迭代过程中的中间变量 然后1e -10 表示的是误差大小(就是当xk" role="presentation">xkxk跟h(xk+1)" role="presentation">h(xk+1)h(xk+1)的差值的绝对值误差,考虑到浮点数)

    from sympy import *

    import random

    x = symbols("x")

    func = (x + 1) ** (1/3)

    begin = 1

    end = 2

    MAXSTEP = 100

    step_count = 0

    x0 = random.uniform(begin, end)

    temp = func.subs(x, x0)

    while step_count < MAXSTEP and abs(temp - x0) > 1e-10:

    x0 = temp

    temp = func.subs(x, x0)

    step_count += 1

    print(x0)

    print(step_count)

    输出的结果是:

    1.32471795712278

    13

    展开全文
  • 不动点迭代法求方程:是迭代法解方程当中经典的方法。 将求解f(x) = 0的问题变成x = h(x)这样的问题。 转变的方程很简单,一般是移项,平方,开根号什么的。 难点: 问题难点就得到的对应不动点迭代方程...

    不动点迭代法

    将原先的
    f ( x ) = 0 f(x) = 0 f(x)=0
    转化成
    x = h ( x ) x = h(x) x=h(x)
    的方式进行求解。

    不动点的存在性定理

    定理1

    如果 f ( x ) f(x) f(x) 为区间 [ a , b ] [a, b] [a,b]上的连续函数,且满足下面两个条件:

    1. 压缩性:对于 x ∈ [ a , b ] x \in [a, b] x[a,b], a ≤ f ( x ) ≤ b a \leq f(x) \leq b af(x)b

    2. 大L性质:存在正常数L<1, 使得,对于任意的 x , y ∈ [ a , b ] x, y \in [a, b] x,y[a,b] 都有,
      ∣ f ( x ) − f ( y ) ∣ ≤ L ∣ x − y ∣ |f(x) - f(y)| \leq L|x-y| f(x)f(y)Lxy

    则存在有唯一的不动点。

    构造 h ( x ) = f ( x ) − x h(x) = f(x) - x h(x)=f(x)x,再用连续函数的介值定理就可以证明存在性,唯一性代入就可证明。

    局部收敛定理:

    若有这样的不动点 x ∗ x^* x ,如果存在有在不动点附近的某个领域,满足有 h ′ ( x ) < 1 h'(x) < 1 h(x)<1,则迭代法:
    x t + 1 = h ( x t ) x_{t+1} = h(x_t) xt+1=h(xt)
    局部收敛。

    • h ′ ( x ∗ ) h'(x^*) h(x)数值越接近0,收敛速度越快。
    • 如果对于小于n次的导数在不动点出都为0,且 h ( n ) ( x ) h^{(n)}(x) h(n)(x) 不一定为0,则称为n阶收敛

    举列子

    • 求根号数的迭代(不妨取根号3)

    迭代方式有很多种比如:
    x 2 − 3 = 0 x = x − λ ( x 2 − 3 ) λ ∈ [ 0 , 1 ] x k + 1 = x k − λ ( x k 2 − 3 ) \begin{aligned} x^2 - 3 =& 0 \\ x =& x - \lambda (x^2 - 3) & \lambda \in [0, 1] \\ x_{k+1} =& x_{k} - \lambda (x_{k}^2 - 3)\\ \end{aligned} x23=x=xk+1=0xλ(x23)xkλ(xk23)λ[0,1]

    代码:

    x = 1
    for i in range(100):
        x = x - 0.1 * (x ** 2 - 3)
    print(x)
    

    输出:

    1.7320508075688772
    

    x 2 − 3 = 0 n x 2 = ( n − 1 ) x 2 + 3 n ∈ N x = ( n − 1 ) x n + 3 n x x k + 1 = ( n − 1 ) x k n + 3 n x k \begin{aligned} x^2 - 3 =& 0 \\ nx^2 =& (n-1)x^2 + 3 & n \in N \\ x =& \frac{(n-1)x}{n} + \frac{3}{nx} \\ x_{k+1} =& \frac{(n-1)x_k}{n} + \frac{3}{nx_k}\\ \end{aligned} x23=nx2=x=xk+1=0(n1)x2+3n(n1)x+nx3n(n1)xk+nxk3nN

    代码:

    x, n = 2, 2
    for i in range(100):
        x = (n - 1) / n * x + 3 / (n * x)
    print(x)
    

    输出:

    1.7320508075688772
    
    • 实际上的 3 \sqrt{3} 3
    import math
    math.sqrt(3)
    
    • 输出:1.7320508075688772

    尾记

    展开全文
  • 在matlab平台下,通过不动点迭代的方法求方程,要注意初值的设定
  • 在[a,b]区间内寻找方程x**5-2*x-1=0的的初始近似值位置,确定不动点迭代的初始点(可能有多个),然后使用不动点迭代法求方程(可能有多个)。前后两次迭代的差的绝对值小于delta后停止迭代。 输入形式 在...

    问题描述

    在[a,b]区间内寻找方程x**5-2*x-1=0的根的初始近似值位置,确定不动点迭代的初始点(可能有多个),然后使用不动点迭代法求方程的根(可能有多个根)。前后两次迭代的差的绝对值小于delta后停止迭代。

    输入形式

    在屏幕上输入3个数,依次为区间左端点值a、右端点值b和所求根的精度值。各数间都以一个空格分隔。根据输入的所求根的精度值可求得delta.

    输出形式

    每一行输出一个根(精确到小数点后3位)

    样例1输入

    -1.2 1.5 3

    样例1输出

    -1.000
    -0.519
    1.291

    样例1说明

    输入:左端点a值为-1.2,右端点b值为1.5,前后两次迭代的差的绝对值小于delta=10**(-3)后停止迭代。输出:从小到大顺序输出三个根的值。

    代码

    import numpy as np
    
    def f(x):
        return x ** 5 - 2 * x - 1
    
    def g1(x):
        return (x**5-1)/2
    
    def g2(x):
        result = (abs(2 * x + 1))**(1 / 5)
        if (2 * x - 1) < 0:
            return -result
        return result
    
    def getEpsilon(x, epsilon):
        maxY = minY = x[0]
        for each in x:
            maxY = max(f(each), maxY)
            minY = min((f(each), minY))
        epsilon = (maxY - minY) * epsilon
        return epsilon
    
    def getInitialVal(x, N, step, epsilon):
        initalVal = []
        for i in range(N + 1):
            y1, y2, y3 = f(x - step), f(x), f(x + step)
            if (y1 * y2 < 0) and (i != 0):
                initalVal.append((x + x - step) / 2)
            if ((y2 - y1) * (y3 - y2) < 0) and (abs(y2) < epsilon):
                initalVal.append(x)
            x += step
    
        return initalVal
    
    def findFixedPoint(initalVal, delta,epsilon):
        points = []
        for each in initalVal:
            if (abs(g1(each)) < 1):
                points.append(iteration(each, g1, delta,epsilon))
            else:
                points.append(iteration(each, g2, delta,epsilon))
        return points
    
    def iteration(p1, g, delta,epsilon):
        while True:
            p2 = g(p1)
            err =abs(p2-p1)
            relerr = err/(abs(p2)+epsilon)
            if err<delta or relerr<delta:
                return p2
            p1 = p2
                        
    def main():
        a, b, c = input().split(' ')
        a = float(a)
        b = float(b)
        c = int(c)
        delta = 10 ** (-c)
        N = 8
        epsilon = 0.01
        step = (b - a) / N
        x = np.arange(a, b + epsilon, epsilon)
        
        epsilon2 = getEpsilon(x,epsilon)
        initalVal = getInitialVal(a, N, step, epsilon2)
        ans = findFixedPoint(initalVal, delta,epsilon)
    
        for each in ans:
            print('%.3f' % each)
            
    if __name__ == '__main__':
        main()
    
    展开全文
  • 【问题描述】在[a,b]区间内寻找方程x**5-2*x-1=0的的初始近似值位置,确定不动点迭代的初始点(可能有多个),然后使用不动点迭代法求方程(可能有多个)。前后两次迭代的差的绝对值小于delta后停止迭代。 ...
  • 不动点迭代法求非线性方程组的一个
  • 不动点迭代法 一元非线性方程求根 C语言实现
  • 不动点迭代法求函数(非线性方程求解) 【问题描述】在[a,b]区间内寻找方程x**5-2*x-1=0的的初始近似值位置,确定不动点迭代的初始点(可能有多个),然后使用不动点迭代法求方程(可能有多个)。前后两次...
  • 不动点迭代法方程

    2021-06-07 09:33:25
    clear; clc; eps=1e-3; x0=-1; max=100; x1=f12(x0); for i=1:1:100 if abs(x1-x0)<=eps break; else x0=x1; x1=f12(x1); end end if i==100 disp('达到最大迭代次数'); else disp(x1); end
  • 传 者:lfwu5说明:Matlab方程求根法汇总:BenvliMAX贝努利法按模最大实BenvliMIN贝努利法按模最小实HalfInterval用二分法求方程的一个hj用黄金分割法求方程的一个StablePoint用不动点迭代法求方程的一....
  • 1)在区间[0,1]内用二分法求方程ex+10∗x−2e^x+10*x-2ex+10∗x−2的近似,要求误差超过0.5×10−30.5\times10^{-3}0.5×10−3。 2)取初值x0=0x_0=0x0​=0,用迭代公式xk+1=2−exk10,(k=0,1,2,...)x_{...
  • 主要介绍了python实现迭代法求方程组的过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 一 不动点是什么?...不动点迭代法,是求方程的迭代方法。为什么要迭代的,直接法不好吗?直接法显然比较好,但是存在弊端,比如函数形式较复杂时,求解器不容易直接求得。利用不动点的性质,可以...
  • 简单迭代法求方程根的MATLAB程序

    千次阅读 2012-07-13 22:30:20
    function [x_reality,n_reality] = Simple_stepit...% 简单迭代法(也叫不动点迭代法)求解方程f_name = 0的MATLAB实现 % f_name为迭代函数 % x_start为开始迭代的初始坐标 % tolerance为函数迭代的精度要求 ...
  • 迭代法的作用 许多复杂的求解问题,都可以转换成方程f(x)=0的求解问题。...简单迭代法或基本迭代法又称不动点迭代法 1、不动点(FixedPoint) 首先来看一下什么是不动点: 换句话说,函数φ的不动点是y=φ(x)与y
  • 以下介绍方法单独使用时并不实用,只是利用由浅入深的原理形成知识体系。...二、 不动点迭代法 三、牛顿迭代法 牛顿迭代法的实际应用: 四、弦截法 ...
  • MATLAB用二分法、不动点迭代法及Newton迭代(切线)法非线性方程 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 一、实验原理 二、实验步骤 三、实验过程 1.(程序) (1)二分法: ...
  • 方程求根:二分法--不动点迭代--牛顿--弦截

    万次阅读 多人点赞 2018-03-09 11:41:54
    方程求根:二分法--不动点迭代--牛顿--弦截1.问题概述 许多复杂的求解问题,都可以转换成方程f(x)=0的求解问题。这一系列的解叫做方程。对于非线性方程的求解,在自变量范围内往往有多个解,我们将此变化...
  • 用MATLAB编写关于如何用史蒂芬不动点迭代法解线性方程组的程序
  • function [x_reality,n_reality] = Simple_stepit( f_name,x_start,tolerance,n_limit)%%% 简单迭代法(也叫不动点迭代法)求解方程f_name = 0的MATLAB实现% f_name为迭代函数% x_start为开始迭代的初始坐标% ...
  • 不动点迭代法解非线性方程的aitken加速法matlab实现
  • function [x_reality,n_reality] = Simple_stepit( f_name,x_start,tolerance,n_limit)%%% 简单迭代法(也叫不动点迭代法)求解方程f_name = 0的MATLAB实现% f_name为迭代函数% x_start为开始迭代的初始坐标% ...
  • 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/一、实验原理二、实验步骤三、实验过程1.(程序)(1)二分法:在区间(1,2)之间的,取(a)bipart.m:function [x,m]=bipart(fun,a0,b0,tol)a=a0;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,411
精华内容 4,964
关键字:

不动点迭代法求方程根