将割线方法编程到Python中

时间:2018-09-07 01:43:29

标签: python-3.x jupyter-notebook

两个数字的和为20。如果每个数字加到其平方根,则两个和的乘积为155.55。使用割线法将两个数字的值近似在10 ^(-4)之内。

2 个答案:

答案 0 :(得分:0)

基于http://campus.murraystate.edu/academic/faculty/wlyle/420/Secant.htm

#inital guess
x1 = 10

x2 = 50
Epsilon = 1e-4
#given function
def func(x): 
    return abs(x)**0.5 * (abs(x)+20)**0.5 - 155.55

y1 = func(x1)
y2 = func(x2)

#loop max 20 times
for i in range(20):
    ans = x2 - y2 * (x2-x1)/(y2-y1)
    y3 = func(ans)
    print("Try:{}\tx1:{:0.3f}\tx2:{:0.3f}\ty3:{:0.3f}".format(i,x1, x2, y3))
    if (abs(y3) < Epsilon):
        break

    x1, x2 = x2, ans
    y1, y2 = y2, y3

print("\n\nThe numbers are: {:0.3f} and {:0.3f}".format(ans, ans+20))

答案 1 :(得分:0)

基于您的标题

此代码在大多数情况下都能正常工作。取自Secant Method Using Python (Output Included)

# Defining Function
def f(x):
    return x**3 - 5*x - 9

# Implementing Secant Method

def secant(x0,x1,e,N):
    print('\n\n*** SECANT METHOD IMPLEMENTATION ***')
    step = 1
    condition = True
    while condition:
        if f(x0) == f(x1):
            print('Divide by zero error!')
            break

        x2 = x0 - (x1-x0)*f(x0)/( f(x1) - f(x0) ) 
        print('Iteration-%d, x2 = %0.6f and f(x2) = %0.6f' % (step, x2, f(x2)))
        x0 = x1
        x1 = x2
        step = step + 1

        if step > N:
            print('Not Convergent!')
            break

        condition = abs(f(x2)) > e
    print('\n Required root is: %0.8f' % x2)


# Input Section
x0 = input('Enter First Guess: ')
x1 = input('Enter Second Guess: ')
e = input('Tolerable Error: ')
N = input('Maximum Step: ')

# Converting x0 and e to float
x0 = float(x0)
x1 = float(x1)
e = float(e)

# Converting N to integer
N = int(N)


#Note: You can combine above three section like this
# x0 = float(input('Enter First Guess: '))
# x1 = float(input('Enter Second Guess: '))
# e = float(input('Tolerable Error: '))
# N = int(input('Maximum Step: '))

# Starting Secant Method
secant(x0,x1,e,N)