用牛顿迭代法求解非线性方程组

1. 下面非线性方程组

2.牛顿迭代法公式

3.几何说明

4.用Python编程

4.1定义函数包

# -*-coding:UTF-S -*-
"""
@author:
@file_name:nonlinear_functions.py
@time:2024-01-08 19:31
@IDE:PyCharm
@copyright:automatic
"""

import sympy  # 导入包,符号运算需要
import math  #  导入包,数值运算需要

# 数值运算 定义函数

def numeric_function(x):
    """
    采用数值求解下面非线性函数
    2*exp(-x)*sin(x)+2*cos(x)+0.25
    :param x:
    :return:返回一个所需求解的函数
    """
    return 2 * math.exp(-x) * math.sin(x) + 2 * math.cos(x) + 0.25

def numeric_diff_function(x):
    """
    newton 法:求非线性方程需要求非线性方程的微分
    :param x:
    :return:
    """
    # u'v+uv',返回一个对非线性函数的一阶导数
    return 2 * math.exp(-x) * (- math.cos(x) - math.sin(x)) - 2 * math.sin(x)

# 符号运算,定义函数
def symbolic_ope_function():
    """
    需要定义符号,符号运算是x是一个符号,不是一个值
    :return:
    """
    # 定义符号
    x = sympy.Symbol("x")  # 定义符号变量x
    return 2 * sympy.exp(-x) * (- sympy.cos(x) - sympy.sin(x)) - 2 * sympy.sin(x)


def diff_symbolic_ope_function():
    """
    符号运算可以直接求导数
    :return:
    """
    return symbolic_ope_function().diff()
    # 是对上个函数symbolic_operation_function()直接求微分

4.2 求解

# -*-coding:UTF-S -*-
"""
@author:
@file_name:nonlinear_equation_newton_iteration.py
@time:2024-01-08 19:30
@IDE:PyCharm
@copyright:automatic
"""

# 输入包
import math  # 输入数学包
import sympy  # 输入符号包

# 从另一个包中导入函数
from data.nonlinear_functions import numeric_function, numeric_diff_function, symbolic_ope_function, diff_symbolic_ope_function


# 数值运算
def numerical_newton_iteration(x0, eps=1e-10, max_iter=100):
    # 定义函数,输入三个参数,分别是初始值,精度,迭代次数
    """
    用数值方法求解非线性方程
    :param x0: 初始值
    :param eps: 精度
    :param max_iter:最大迭代次数
    :return:
    """


    print("%5s, %21s, %21s" % ("iter", "ApproximateRoot", "ErrorPrecision"))
    # 定义初值
    x_next = x0
    for iter in range(max_iter):
        # 循环次数[0,max_iter-1]
        x_before = x_next  # 近似解不断更替,直至收敛
        x_next = x_before - numeric_function(x_before) / numeric_diff_function(x_before)

        # 算精度
        tol = abs(x_next - x_before)

        # 输出
        print("%3d, %20.15f, %20.15e" % (iter + 1, x_next, tol))

        # 如果精度满足要求,跳出
        if tol <= eps:
            break


# 符号运算
def symbolic_newton_iteration(x0, eps=1e-10, max_iter=100):
    """
    用符号运算求解非线性方程
    :param x0: 初始值
    :param eps: 精度
    :param max_iter:最大迭代次数
    :return: 近似解
    """

    fh,dfh = symbolic_ope_function(),diff_symbolic_ope_function()
    # 把两个函数给fh和dfh
    x = fh.free_symbols.pop()  # 返回集合{x,y,z}中的x
    x_next = x0  # 初始化
    for iter in range(max_iter):
        x_before = x_next  # 近似解不断更替
        fx = fh.evalf(subs=({x: x_before}))  # 用evalf函数求解fh函数
        dfx = dfh.evalf(subs=({x: x_before}))
        # 核心公式
        x_next = x_before - fx / dfx

        # 算精度
        tol = abs(x_next - x_before)
        print("%3d, %20.15f, %20.15e" % (iter + 1, x_next, tol))

        # 如果满足精度跳出
        if tol <= eps:
            break

if __name__ == '__main__':
    x0 = float(input("1.请输入初始值x0:"))
    eps = float(input("2.请输入精度eps:"))
    max_iter = int(input("3.请输入最大迭代次数max_iter:"))
    numerical_newton_iteration(x0=x0, eps=eps, max_iter=max_iter)  # 运行函数
    print("=" * 50)
    symbolic_newton_iteration(x0=x0, eps=eps, max_iter=max_iter)

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 牛顿迭代法是一种求解线性方程组的方法,可以使用Matlab进行实现。具体步骤如下: 1. 定义线性方程组的函数表达式,例如: function F = myfun(x) F(1) = x(1)^2 + x(2)^2 - 1; F(2) = x(1) - x(2)^2; 2. 定义牛顿迭代法的迭代公式,例如: function [x, k] = newton(fun, x0, tol, maxiter) k = 0; x = x0; while k < maxiter F = fun(x); J = jacobian(fun, x); dx = -J\F'; x = x + dx'; if norm(F) < tol break; end k = k + 1; end 3. 调用函数进行求解,例如: [x, k] = newton(@myfun, [1, 1], 1e-6, 100); 其中,@myfun表示使用myfun函数进行求解,[1, 1]表示初始值,1e-6表示误差容限,100表示最大迭代次数。 4. 输出结果,例如: disp(['Solution: x = [', num2str(x(1)), ', ', num2str(x(2)), ']']); disp(['Iterations: ', num2str(k)]); 这样就可以使用Matlab实现牛顿迭代法求解线性方程组了。 ### 回答2: 牛顿迭代法求解线性方程组的一种有效方法,它通过一系列迭代公式逼近方程组的根。在matlab中,我们可以使用该方法求解线性方程组。 首先,我们需要定义一个函数句柄来表示线性方程组,比如: ``` f = @(x) [x(1)^2 + x(2)^2 - 4; x(1)*x(2) - 1]; ``` 这里定义的函数句柄f表示一个含有两个未知变量的线性方程组,其中第一个方程表示一个以原点为圆心,半径为2的圆,第二个方程表示一个过点(1,1)的直线与x轴的交点。 接下来,我们需要设定初始值x0和迭代终止条件tol,比如: ``` x0 = [1;1]; tol = 1e-6; ``` x0表示迭代的起点,tol表示迭代的终止条件,通常设置为一个较小的正数,如1e-6,表示当两个相邻迭代结果的差值小于等于1e-6时停止迭代。 然后,我们可以使用牛顿迭代公式对方程组进行迭代求解,具体公式如下: ``` x = x - J\f(x); ``` 其中,x表示当前迭代点的值,J表示方程组f在当前迭代点的雅可比矩阵,f(x)表示当前迭代点对应的方程组的函数值,\表示矩阵的左除,即求解如下线性方程组: ``` J*dx = -f(x) ``` 其中,dx表示当前迭代点相对于上一个迭代点的增量,即: ``` dx = x - x_prev; ``` 我们可以使用一个循环来实现牛顿迭代的过程,如下: ``` x = x0; x_prev = x0; while norm(x - x_prev) > tol J = [2*x(1) 2*x(2); x(2) x(1)]; dx = J\-f(x); x_prev = x; x = x + dx; end ``` 其中,norm函数用来计算向量的2-范数,表示向量的长度。迭代过程中,我们先计算当前点的雅可比矩阵J和函数值f(x),然后求解线性方程组得到增量dx,最后更新迭代点的值。 最后,我们可以使用disp函数输出最终的迭代结果,如下: ``` disp(['x = (' num2str(x(1)) ', ' num2str(x(2)) ')']); ``` 通过以上步骤,我们就可以成功地使用牛顿迭代法求解线性方程组。 ### 回答3: 牛顿迭代法是一种求解线性方程组的常用方法,它是基于牛顿-拉夫逊迭代法的思想,通过不断迭代逼近线性方程组的解。在matlab中,可以使用牛顿迭代法求解线性方程组,其步骤如下: 1. 首先定义线性方程组的函数表达式,如:f = @(x) [x(1)^2+x(2)-11;x(1)+x(2)^2-7]; 2. 然后定义线性方程组的雅可比矩阵,即f的偏导数矩阵,如:df = @(x) [2*x(1),1;1,2*x(2)]; 3. 初始化解向量,如:x = [1;1]; 4. 设置收敛条件,如:tol = 1e-6; 5. 开始迭代,如:for i=1:100 f_val = f(x); df_val = df(x); dx = -df_val\f_val; x = x + dx; if(norm(dx)<tol) break; end end 以上就是用牛顿迭代法求解线性方程组的基本步骤,通过不断迭代可以逼近方程组的解。需要注意的是,初始解向量的设置、收敛条件的确定以及迭代次数的控制都会影响迭代结果的精度和速度,需要根据具体需要进行调整。此外,在matlab中还可以使用fsolve函数来实现牛顿迭代法求解线性方程组,其使用方法更加方便快捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值