Есть ли проблема с округлением до 6 цифр? - PullRequest
1 голос
/ 27 января 2020

Я попробовал следующий код, чтобы найти root уравнения с использованием техники инкрементального поиска. Когда я установил точность 5 или 7 цифр, код работал отлично. Но когда я устанавливаю точность в 6 цифр, код не может дать правильное значение Что мне делать в этом случае. Код выглядит следующим образом:

import numpy as np
import matplotlib.pyplot as mpl
import prettytable as PT

func_input=input("Function i/p (in numpy notation): ")
fn = eval("lambda x:" + func_input)
## (667.38/x)*(1-np.exp((-0.146843)*x))-40
print ("Function is: ",func_input)
p=int(input("Precision: "))

print("Refer to the graph of the function for the start value")
x1=float(input("Start From: "))

i=0
m=x1
while (m<=x1+4.0):
    m=x1+i*(10**(-p))
    y=round(fn(m),p)
    if (y==0):
        break
    i+=1

print("The root is: ",m)

Я получил следующий вывод для различных значений точности:

Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 22:39:24) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> 
= RESTART: C:/Users/3D/Desktop/Rushikesh/Python Programs/Roots of Equation/Bracketing Methods/05_Incremental Search.py
Function i/p (in numpy notation): (667.38/x)*(1-np.exp((-0.146843)*x))-40
Function is:  (667.38/x)*(1-np.exp((-0.146843)*x))-40
Precision: 5
Refer to the graph of the function for the start value
Start From: 14.5
The root is:  14.78021
>>> 
= RESTART: C:/Users/3D/Desktop/Rushikesh/Python Programs/Roots of Equation/Bracketing Methods/05_Incremental Search.py
Function i/p (in numpy notation): (667.38/x)*(1-np.exp((-0.146843)*x))-40
Function is:  (667.38/x)*(1-np.exp((-0.146843)*x))-40
Precision: 7
Refer to the graph of the function for the start value
Start From: 14.5
The root is:  14.7802086
>>> 
= RESTART: C:/Users/3D/Desktop/Rushikesh/Python Programs/Roots of Equation/Bracketing Methods/05_Incremental Search.py
Function i/p (in numpy notation): (667.38/x)*(1-np.exp((-0.146843)*x))-40
Function is:  (667.38/x)*(1-np.exp((-0.146843)*x))-40
Precision: 6
Refer to the graph of the function for the start value
Start From: 14.5
The root is:  18.500001
>>> 

1 Ответ

1 голос
/ 27 января 2020

Похоже, что при округлении подпрограмма пропускает случай завершения (так что y идет чуть ниже нуля и чуть больше нуля, фактически не достигая нуля).

Предложить замену y == 0 проверить с помощью math.close() или просто вернуть x для наименьшей найденной величины y (т. Е. Ближайшей к нулю).

Надеюсь, это поможет : -)

...