1. 迭代法求解非线性方程组的原理

        参考西安交大数值分析教材

2. 迭代法求解非线性方程组的计算过程

牛顿法求解非线性方程组的计算过程如下

弦割法与牛顿法类似,弦割法将牛顿法中的偏导数用差商替代,即将上述牛顿法中的第(ii)步和第(iii)步转化为以下迭代格式

布罗伊登法求解非线性方程组的计算过程如下

3. 程序使用说明

程序使用方法为:(1)定义自变量;(2)使用(1)中的自变量定义非线性方程组列表;(3)给定初值,精度以及迭代次数;(4)调用方程netwon(),broyden(),string_cut(),分别对应牛顿法,布罗伊登法和弦割法。具体如下所示

4. python实现代码

'''
使用牛顿法、弦割法、布罗伊登法求解非线性方程组
'''
import sympy
import pprint
import numpy as np#计算向量范数
def Norm2(p):sum_of_p = sum([i ** 2 for i in p])return sum_of_p ** 0.5#牛顿法
def newton(A, x_0, args, prec=0.00000001, n=10):funcs=sympy.Matrix(A)args=argsjacobianMatrix=funcs.jacobian(args) #计算雅可比矩阵#pprint.pprint(jacobianMatrix.inv())x_0=sympy.Matrix(x_0)x = argsx_pre = x_0for k in range(0, n): #迭代求解b = - funcs.subs(zip(x, x_pre)) #计算f(x【k】)J = jacobianMatrix.subs(zip(x, x_pre))  #计算雅可比矩阵Jf(x【k】)deltx = sympy.Matrix(J.inv() * b) #使用雅可比矩阵的逆求解deltxx_new = x_pre + deltx  #迭代跟新xif Norm2(funcs.subs(zip(x, x_new))) < prec: #如果满足精度要求则返回#pprint.pprint(x_new)#print(k)return([x_new,k])x_pre = x_newreturn("迭代次数较少,无法满足精度要求")#弦割法
def string_cut(A, x_0, args, prec=0.00000001, n=10):funcs = sympy.Matrix(A)#args = argsh = 0.1 #设置h的大小e = np.eye(len(A))*h#pprint.pprint(e)x_0 = sympy.Matrix(x_0)x = argsx_pre = x_0c=[]for k in range(0,n):for p in range(len(A)):c.append([A[p].subs(zip(x, (x_pre + sympy.Matrix(e[j]))))for j in range(0, len(A))])fij = sympy.Matrix(c) #计算fij【k】#pprint.pprint(fij)b = funcs.subs(zip(x, x_pre)) #计算fi【k】z = fij.inv() * b  #求解zdeltx = h * z / (sum(z) - 1)  #计算deltxx_new = x_pre + deltx #更新xif Norm2(funcs.subs(zip(x, x_new))) < prec: #满足精度要求则返回#pprint.pprint(x_new)#print(k)return([x_new,k])x_pre = x_newc = []return("迭代次数较少,无法满足精度要求")def broyden(A, x_0, args, prec=0.00000001, n=10):funcs = sympy.Matrix(A)args = argsjacobianMatrix = funcs.jacobian(args)x_0 = sympy.Matrix(x_0)x = argsb = funcs.subs(zip(x, x_0))J0 = jacobianMatrix.subs(zip(x, x_0))x_1 = x_0 - J0.inv() * bprec = prec#以下得到两个初始迭代值和初始A【0】矩阵x_pre = x_0x_now = x_1J = jacobianMatrix.subs(zip(x, x_pre)).inv() #A【0】的逆#迭代计算for k in range(0, n):s = x_now - x_pre #计算s【k】y = funcs.subs(zip(x, x_now)) - funcs.subs(zip(x, x_pre)) #计算y【k】temp1 = (s - J * y) * s.T * Jtemp2 = (s.T * J * y)num = temp2 ** (-1)e=np.eye(len(A))n_num=np.array(num)e_num=e*(n_num)diag = sympy.diag(e_num)temp = temp1 * diag  #将除以一个数变为乘其逆的对角单位矩阵J_new = J + temp #得到A【k】的逆x_new = x_now - J_new * funcs.subs(zip(x, x_now)) #更新x的值if Norm2(funcs.subs(zip(x, x_new))) < prec: #如果满足精度要求则返回#pprint.pprint(x_new)#print(k)return [x_new, k]x_pre = x_nowx_now = x_newJ = J_newreturn ("迭代次数较少,无法满足精度要求")if __name__ == "__main__":#---------------------------计算实习7.3.1-------------------------------x1, x2, x3 = sympy.symbols("x1 x2 x3") #定义自变量args = sympy.Matrix([x1, x2, x3]) #定义自变量参数矩阵#定义非线性方程组列表A = [x1 ** 2 + x2 ** 2 + x3 ** 2 - 1.0,2 * x1 ** 2 + x2 ** 2 - 4 * x3 ** 2,3 * x1 ** 2 - 4 * x2 ** 2 + x3 ** 2]x_0 = [1.0, 1.0, 1.0] #设置初始向量prec = 0.00000001 #设置精度n=20 #设置迭代次数p = newton(A, x_0, args, prec, n) #牛顿法求解pprint.pprint(p)p = broyden(A, x_0, args, prec, n) #布罗伊登法求解pprint.pprint(p)p = string_cut(A, x_0, args, prec, n) #弦割法求解pprint.pprint(p)#----------------------------计算实习7.3.2-------------------------------# x1, x2 = sympy.symbols("x1 x2")# args = sympy.Matrix([x1, x2])# A=[sympy.cos(x1**2+0.4*x2)+x1**2+x2**2-1.6, 1.5*x1**2-1/0.36*x2**2-1.0]# x_0=[1.04, 0.47]# prec = 0.00000001# n=20# p = newton(A, x_0, args, prec, n)# pprint.pprint(p)# p = broyden(A, x_0, args, prec, n)# pprint.pprint(p)# p = string_cut(A, x_0, args, prec, n)# pprint.pprint(p)

迭代法求解非线性方程组(含python代码)相关推荐

  1. python牛顿法解非线性方程组_matlab实现牛顿迭代法求解非线性方程组.pdf

    matlab实现牛顿迭代法求解非线性方程组.pdf matlab 实现牛顿迭代法求解非线性方程组实现牛顿迭代法求解非线性方程组 已知非线性方程组如下 3*x1-cosx2*x3-1/20 x12-81 ...

  2. 非线性方程组牛顿迭代法matlab,matlab实现牛顿迭代法求解非线性方程组

    <matlab实现牛顿迭代法求解非线性方程组>由会员分享,可在线阅读,更多相关<matlab实现牛顿迭代法求解非线性方程组(5页珍藏版)>请在人人文库网上搜索. 1.matla ...

  3. matlab牛顿法解非线性方程组,matlab实现牛顿迭代法求解非线性方程组.pdf

    资源描述 matlab 实现牛顿迭代法求解非线性方程组实现牛顿迭代法求解非线性方程组 已知非线性方程组如下 3*x1-cos(x2*x3)-1/2=0 x1^2-81*(x2+0.1)^2+sin(x ...

  4. Matlab利用牛顿迭代法求解非线性方程组

    我们得首先了解牛顿迭代法的原理是什么: 在这里,我以二阶非线性方程组为例: f1(x,y)=0 f2(x,y)=0,求解x,y 原理 假设方程组的一组近似解为(x0,y0),将方程f1(x,y)=0与 ...

  5. c语言牛顿迭代法求解非线性方程组,利用牛顿迭代法求解非线性方程组

    最近一个哥们,是用牛顿迭代法求解一个四变量方程组的最优解问题,从网上找了代码去改进,但是总会有点不如意的地方,迭代的次数过多,但是却没有提高精度,真是 最近一个哥们,是用牛顿迭代法求解一个四变量方程组 ...

  6. python牛顿法解非线性方程组_用牛顿迭代法解非线性方程组

    题目: 用牛顿迭代法解非线性方程组 有两个非线性方程,未知数是x1,x2: (15x1+10x2)/[(40-30x1-10x2)^2×(15-15x1)]=5e-4; (15x1+10x2)/[(4 ...

  7. MATLAB求解非线性方程组的五种方法

    MATLAB求解非线性方程组的五种方法 求解线性方程分为两种方法–二分法和迭代法 常见的方法一共有5种 二分法 迭代法 牛顿法 割线法 拟牛顿法 Halley法 使用条件 二分法需要知道两个自变量,分 ...

  8. 拟牛顿法求解非线性方程组

    文章目录 牛顿法求解非线性方程组 拟牛顿法 案例 Python代码 牛顿法求解非线性方程组 假设有非线性方程组 f(x)=0f(x)=0f(x)=0, 解为x∗x^{*}x∗ f(x∗)=f(x~)+ ...

  9. matlab矩阵方程奇异,matlab求解非线性方程组 牛顿迭代发 奇异矩阵

    求高手帮忙看看下面的程序怎么改  牛顿迭代法  求解后现实矩阵奇异,跪求高手 -------------------------------- %首先建立函数fun %储存方程组编程如下将fun.m ...

最新文章

  1. Java 实现 SSH 协议的客户端登录认证方式
  2. Android登录拦截器实现方式(二)
  3. Mac下使用svn命令
  4. 电源系统中纹波和噪声的处理
  5. ASA防火墙外部web应用端口与默认审查协议相冲突的解决方法
  6. SLAM: Orb_SLAM中的ORB特征
  7. android listview 优化,Android ListView、GridView等性能优化
  8. 最长非单调增序列(最长非单调增序列,,要用N*LOG N(非常值得琢磨的算法。)...
  9. DB2新建编目及删除编目
  10. 每秒570000的写入,MySQL如何实现?
  11. c语言用指针访问简单变量,关于C语言指针,个人认为最经典、最简单的一个应用...
  12. 拯救Ubuntu环境变量搞蹦导致命令使用不了的办法
  13. oracle.exe占用内存过大,【大话IT】oracle.exe耗尽物理内存
  14. 使用 Python 构建电影推荐系统
  15. Elasticsearch - 短语匹配(match_phrase)以及slop参数
  16. Git安装教程(超详细教程)
  17. 工业通讯 | STM32F4xx应用控制器与SoM集成
  18. HDU-2594 Simpsons’ Hidden Talents
  19. 分析响应时间ns级别的TVS管个中奥秘
  20. Vue Admin Plus、Vue Shop Vite 官网演示地址文档

热门文章

  1. IDEA + github pull request + teamcity运用
  2. C语言常见问题(五)——字符串
  3. js,提示,eclipse
  4. 冷笑话,收集很多的冷笑话
  5. NavigationView简单操作
  6. 蒙特梭利素材-【彩色圆柱体1】蒙氏教具 三段卡 蒙氏素材
  7. idea中添加类、方法注释,快捷键设置
  8. 英特尔的这些黑科技你一定没见过
  9. interrupt()中断对LockSupport.park()的影响
  10. 1881:【14NOIP提高组】生活大爆炸版石头剪子布