Другое упражнение. Он попросил оценить значение x для x-2 = ln (x). Существует два подхода (A и B) - один использует данное уравнение и дает меньшее решение (x1). Другой подход использует e ** (x-2) = x и дает другое решение (x2).Принудительное число десятичных знаков при печати результатов
Программа отображает графическое решение, а затем запрашивает ввод начального значения. Затем он оценивает x, используя соответствующие подходы. Подход A требует начального условия, меньшего, чем x2, для подхода B требуется начальное условие, большее, чем x1. Оба подхода работают для начальных условий, лежащих где-то между x1 и x2.
Последняя часть кода управляет выходом для печати только уникальных решений.
# imports necessary modules
import matplotlib.pyplot as plt
import numpy as np
# plots the equation to provide insight into possible solutions
p = []
x = np.arange(0,5,0.01)
f = x - 2
g = np.log(x)
plt.plot(x,f)
plt.plot(x,g)
plt.show()
# x - 2 = ln(x)
print
lista = map(float, raw_input("Provide the starting conditions to establish the approximate value of the solutions to x-2=ln(x) (separate with spacebar): ").split(" "))
print
sigdig = int(raw_input("Define the number of significant digits (up to 15): "))
print
results1 = []
results2 = []
results3 = []
results4 = []
results = []
resu = []
for i in lista:
if i > 0.1586:
y = i
left = y - 2
right = np.log(y)
expo = "%d" % sigdig
epsi = 10**(-int(expo)-1)
step = 0
while abs(left - right) > epsi:
y = right + 2
right = np.log(y)
left = y - 2
step += 1
results1.append(y)
results2.append(results1[-1])
if i < 3.1462:
z = i
left = np.e ** (z - 2)
right = z
expo = "%d" % sigdig
epsi = 10**(-int(expo)-1)
step = 0
while abs(left - right) > epsi:
z = np.e ** (right - 2)
left = np.e ** (z - 2)
right = z
step += 1
results3.append(z)
results4.append(results3[-1])
# combines and evaluates the results
results = results2 + results4
for i in range(len(results)):
if round(results[i], sigdig) not in resu:
resu.append(round(results[i], sigdig))
else:
pass
print "For given starting conditions following solutions were found:"
print
for i in range(len(resu)):
printer = '"x_%d = %.' + str(sigdig) + 'f" % (i+1, resu[i])'
print eval(printer)
Мои вопросы: можно ли кормить приближенные значения x1 и x2 (строки 36 и 53) из графического решения вместо жесткого кодирования их? Можно ли применять число десятичных знаков без использования eval в коде? Печать resu [i] обычно дает результаты, которые заканчиваются до ближайшего десятичного числа «0» (ближе к концу кода). Благодарю.
Независимо от числа, которое вы пытаетесь применить: 'round (n, sigfig)'. –
Дело в том, что я уже закодировал его, но он не работает. Он разрезается прямо до ближайшего десятичного нуля. – user2126752
Это должно быть два вопроса. Вы задаете две разные вещи, которые совершенно не связаны. –