python求非线性方程的解/非线性方程组的解

本文介绍了使用Python的scipy.optimize模块中的fsolve和root函数求解非线性方程和方程组的方法。通过具体例子展示了如何设置初始猜测值,并获取收敛解。同时给出了求解过程中的详细输出结果。
部署运行你感兴趣的模型镜像
用到的是scipy.optimize中的fsolve和root这两个函数,以下是简单使用:
from scipy.optimize import root,fsolve
import numpy as np
from matplotlib import pyplot as plt
#求多元非线性方程组的解
def f1(x):
    return np.array([2*x[0]**2+3*x[1]-3*x[2]**3-7,
                    x[0]+4*x[1]**2+8*x[2]-10,
                    x[0]-2*x[1]**3-2*x[2]**2+1])

sol_root = root(f1,[0,0,0])#3个0,指的的三个未知量的猜测值
sol_fsolve = fsolve(f1,[0,0,0])
print(sol_root)
print(sol_fsolve)

#求非线性方程的解
def f2(x):
    return 2*np.sin(x)-x+2
x=np.linspace(-5,5,num=100)
y=f2(x)
root1=fsolve(f2,[1])#其实就是方程组等于0的根
root2=root(f2,[1])
print(root1)
print(root2)
plt.plot(x,y,'r')
plt.show()
输出如下:
    fjac: array([[ 0.96686457,  0.08921948,  0.23919195],
       [ 0.07663272,  0.79230209, -0.60529731],
       [ 0.24351659, -0.60357045, -0.75921168]])
     fun: array([-1.64249059e-10, -1.37286271e-09,  1.57796576e-09])
 message: 'The solution converged.'
    nfev: 26
     qtf: array([-1.67013674e-09, -5.92841205e-08, -1.20357384e-08])
       r: array([ 6.34170416,  2.71007612, -1.39511094,  7.99929572,  1.70538181,
       -4.90041988])
  status: 1
 success: True
       x: array([1.52964909, 0.973546  , 0.58489796])
[1.52964909 0.973546   0.58489796]
[2.75467375]
    fjac: array([[-1.]])
     fun: array([-1.99840144e-14])
 message: 'The solution converged.'
    nfev: 14
     qtf: array([-1.24821238e-08])
       r: array([2.85214767])
  status: 1
 success: True
       x: array([2.75467375])

对了,还有个图:

还是放一下官网比较好:rootfsolve

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 方法概述 对于非线性方程组,可以采用 **牛顿迭代法** 或其他改进型方法。这些方法基于目标函数及其导数(雅可比矩阵),逐步逼近真实直到满足指定误差要[^1]。 ### 牛顿迭代法的核心原理 该方法利用泰勒展开近似原方程,在每一步更新中寻找更接近真的位置。假设我们有如下非线性方程组: $$ F(\vec{x}) = 0 $$ 其中 $F$ 表示由若干个非线性方程组成的矢量场。每次迭代按照下述公式执行: $$ \Delta x_k = -J_F^{-1}(\vec{x}_k)F(\vec{x}_k), $$ 随后更新位置为: $$ \vec{x}_{k+1} = \vec{x}_k + \Delta x_k. $$ 这里的 $J_F(\vec{x}_k)$ 即为目标函数在当前点处的雅可比矩阵。 当连续两次迭代之间的变化幅度以及残差均小于预定阈值时停止运算,即: - $\|\Delta x_k\| < \epsilon,$ - $\|F(\vec{x}_k)\| < \epsilon.$ 此处取 $\epsilon=10^{-3}$. --- ### Python 实现代码 下面提供了一个完整的 Python 脚本来演示如何使用牛顿迭代法非线性方程组,并确保最终结果达到所需精度。 ```python import numpy as np def newton_method(F, J, initial_guess, tol=1e-3, max_iterations=50): """ 使用Newton-Raphson方法非线性方程组 参数: F (function): 非线性方程组作为输入接受一个数组并返回另一个数组。 J (function): 接受相同类型的输入并返回对应的雅可比矩阵。 initial_guess (array-like): 初始猜测值。 tol (float): 停止准则使用的公差,默认为1E-3。 max_iterations (int): 最大允许迭代次数,默认为50次。 返回: ndarray: 数值向量。 """ x = np.asarray(initial_guess).astype(float) iteration_count = 0 while True: f_value = F(x) jacobian_matrix = J(x) dx = np.linalg.solve(jacobian_matrix, -f_value) x_new = x + dx error_residual = np.linalg.norm(f_value) step_size = np.linalg.norm(dx) print(f"Iteration {iteration_count}: Current estimate={x_new}, Residual norm={error_residual:.6e}") if error_residual < tol and step_size < tol: break if iteration_count >= max_iterations: raise RuntimeError("Exceeded maximum number of iterations.") x = x_new.copy() iteration_count += 1 return x # 定义具体的非线性方程系统与其雅可比矩阵 def system_of_equations(variables): """定义待决问题的具体形式""" u, v = variables eq1 = u**2 + v**2 - 4 eq2 = np.exp(u) + v - 1 return np.array([eq1, eq2]) def jacobian_matrix(variables): """对应上述系统的雅可比矩阵表达式""" u, v = variables du_eq1 = 2*u; dv_eq1 = 2*v; du_eq2 = np.exp(u); dv_eq2 = 1.; return np.array([[du_eq1, dv_eq1], [du_eq2, dv_eq2]]) initial_approximation = [1., 1.] resultant_solution = newton_method(system_of_equations, jacobian_matrix, initial_approximation) print("\nFinal Solution:", resultant_solution) ``` 此脚本展示了整个过程中的估计值调整情况,直至达成所期望的精确度为止。 --- ### 注意事项 尽管牛顿法通常表现出较快的收敛速度,但它也存在一些局限性和挑战: - 如果初值选取不当,可能造成发散现象; - 当遇到病态问题或奇异点附近区域时需谨慎处理;必要情况下引入阻尼机制或其他修正措施有助于改善稳定性[^4]。 另外值得注意的是,针对某些特定结构化的大型稀疏矩阵场景,还可以探索更加高效的替代方案如拟牛顿类算法等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值