python中的2D牛顿方法

时间:2018-06-11 20:45:30

标签: python newtons-method

我正在编写Python中的后向Euler方法,我在编码Newton部分时遇到了问题。我们给出了1e-4的容差,并且使用这个我在牛顿方法的输出向量中得到非常小的数字。

这是我的代码:

def Newt(U,x,tol): #takes in matrix, x vector, tolerance 

    error=np.matrix([[1],[1]])  #set an error matrix of 1,1
    while abs(LA.norm(error))>tol:
        func=function(U,x)   #define a f(x) vector
        jac=functionprime(U,x) #define the inverse jacobian vector
        y0=jac*func  #the change vector is the jacobian inverse times the function
        xn=x-y0 #the new x is the difference
        error=xn-x #set the error
        x=xn
    print(x)     

对于这个问题,我正在使用这些函数函数:

A=np.matrix([[-33.4, 66.6], [33.3, -66.7]]) #A matrix
x0=np.matrix([[3],[0]]) #x0 verctor

def function(A,x):
    z=A*x
    return(z) #all my function does is multiply the matrix by the x vector

def functionprime(A,x0):
    b=(1/10)*np.matrix([[-66.7,-66.6],[-33.3,-33.4]]) #tried to code this to just output the inverse jacobian 
    return(b)

当我运行它时,我得到一个矩阵:

[[  4.31664687e-27],
 [  2.15832344e-27]]

这太小了,无法在我的向后欧拉函数中使用,这让我觉得我的牛顿有问题。任何人都可以帮我弄清楚我在做错了什么吗?根据我对牛顿函数的理解,这看起来应该是正确的,但显然它并没有完全按照我的需要去做。

另外要在我的代码顶部运行此函数,我有:

import matplotlib.pyplot as plt
import math
import numpy as np
from pylab import *
from numpy import linalg as LA

并非所有这些都需要,但有些是!

1 个答案:

答案 0 :(得分:0)

您的解决方案可能没有问题(除雅各布的计算外)。在我看来,你正试图解决A*x==0。这个系统的明显解决方案是x=0,这就是你得到的。

要查看此内容,请尝试将function()更改为:z = A * x + np.matrix([[1], [-3]])