2
# Prototype of N-R for a system of two non-linear equations
#evaluating  functions of two variables
# f(x,y)=1.6 * x ** 2 + 3.6 * x * y - 7.8 * x - 2.6 * y + 5.2
# g(x,y)=0.9 * y ** 2 + 3.1 * x **2 - 6.2 * x + 6.2 * y

# x = 0.5
# y =0.4

from math import *

eq1 = raw_input('Enter the equation 1: ')
eq2 = raw_input('Enter the equation 2: ')
x0 = float(input('Enter x: '))
y0 = float(input('Enter y: '))

def f(x,y):
    return eval(eq1)

def g(x,y):
    return eval(eq2)

Ea_X = 1
x = x0
y = y0

for n in range(1, 8):

    a = (f(x + 1e-06, y) - f(x,y)) / 1e-06   #in this one start the trouble
    b = (f(x, y + 1e-06) - f(x,y)) / 1e-06
    c = 0 - f(x,y)
    d = (g(x + 1e-06, y) - g(x,y)) / 1e-06
    eE = (g(x, y + 1e-06) - g(x,y)) / 1e-06
    f = 0 - g(x,y)


    print "f(x, y)= ", eq1
    print "g(x, y)= ", eq2
    print """x   y """
    print x, y
    print """a   b   c   d   e   f """
    print a, b, c, d, e, f

    print """
    a * x + b * y = c
    d * x + e * y = f
    """

    print a," * x  +  ",b," * y  =  ",c
    print d," * x  +  ",eE," * y  =  ",f

    _Sy = (c - a * f / d) / (b - a * eE / d)
    _Sx = (f / d) - (eE / d) * _Sy

    Ea_X = (_Sx ** 2 + _Sy ** 2)**0.5


    x = x + _Sx
    y = y + _Sy

    print "Sx = ", _Sx
    print "Sy = ", _Sy

    print "x = ", x
    print "y = ", y

    print "|X_1 - X_0| = ", Ea_X

私は 2 つの非線形方程式に対してニュートン ラプソン法をテストしてきました。プロトタイプ コードは機能しますが、プロトタイプは 2 つの方程式の入力と最初の推測に関するものであるため、より便利にすることを考えていました。私が扱っている非常に多くの方程式の1つだけを解決するために、6や10のようなプロセスを開始する代わりに、forループを実装するとよいでしょう

# Prototype of N-R for a system of two non-linear equations
# f(x,y)=1.6 * x ** 2 + 3.6 * x * y - 7.8 * x - 2.6 * y + 5.2
# g(x,y)=0.9 * y ** 2 + 3.1 * x **2 - 6.2 * x + 6.2 * y

# x = 0.5
# y =0.4


# evaluating  functions of two variables

from math import *


eq1 = raw_input('Enter the equation 1: ')
eq2 = raw_input('Enter the equation 2: ')
x0 = float(input('Enter x: '))
y0 = float(input('Enter y: '))

def f(x,y):
    return eval(eq1)

def g(x,y):
    return eval(eq2)

Ea_X = 1
x = x0
y = y0

a = (f(x + 1e-06, y) - f(x,y)) / 1e-06
b = (f(x, y + 1e-06) - f(x,y)) / 1e-06
c = 0 - f(x,y)
d = (g(x + 1e-06, y) - g(x,y)) / 1e-06
eE = (g(x, y + 1e-06) - g(x,y)) / 1e-06
f = 0 - g(x,y)


print "f(x, y)= ", eq1
print "g(x, y)= ", eq2
print """x   y """
print x, y
print """a   b   c   d   e   f """
print a, b, c, d, e, f

print """
a * x + b * y = c
d * x + e * y = f
"""

print a," * x  +  ",b," * y  =  ",c
print d," * x  +  ",eE," * y  =  ",f

_Sy = (c - a * f / d) / (b - a * eE / d)
_Sx = (f / d) - (eE / d) * _Sy

Ea_X = (_Sx ** 2 + _Sy ** 2)**0.5


x = x + _Sx
y = y + _Sy

print "Sx = ", _Sx
print "Sy = ", _Sy

print "x = ", x
print "y = ", y

print "|X_1 - X_0| = ", Ea_X
4

2 に答える 2

3

問題は次のとおりです。

f = 0 - g(x,y)

f関数から に再バインドしていfloatます。

于 2013-01-27T20:34:27.330 に答える
3

ラインで

f = 0 - g(x,y)

名前に番号を割り当てますf。Python では関数と他の変数が名前空間を共有するため (関数は、任意の変数にバインドされた単なる呼び出し可能なオブジェクトです)、これにより、以降の反復が失敗します。上記の行で割り当てている値に別の名前を付けてください。

于 2013-01-27T20:35:24.353 に答える