2013-03-02 4 views
2

Другое упражнение. Он попросил оценить значение 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» (ближе к концу кода). Благодарю.

+0

Независимо от числа, которое вы пытаетесь применить: 'round (n, sigfig)'. –

+0

Дело в том, что я уже закодировал его, но он не работает. Он разрезается прямо до ближайшего десятичного нуля. – user2126752

+0

Это должно быть два вопроса. Вы задаете две разные вещи, которые совершенно не связаны. –

ответ

1

Вы можете использовать * в строках формата python аналогично C/C++. Когда оператор % встречает * в строке формата, он ищет целочисленное число в списке и использует его, как если бы он был константой в строке формата.

Следующие должны работать для того, что вы пытаетесь сделать:

print "x_%d = %.*f" % (sigdig,sigdig,resu[i]) 

Если result является 1.23456 и sigdig является 3, это будет выход:

x_3 = 1.234 

Обратите внимание, что питон поплавки IEEE794 double precision values, что означает, что у них около 15 значащих цифр. Например:

>>> print "x_%d = %.*f" % (30,30,1.0/3.0) 
x_30 = 0.333333333333333314829616256247 

Обратите внимание, что все, что находится за пределами 17-го десятичного знака, по сути является случайным мусором.

+0

для i в диапазоне (len (resu)): \t печать круглый (resu [i], sigdig) – user2126752

+0

Вышеуказанный не работает. Если sigdig = 30, по какой-то причине он не будет печатать 30 десятичных знаков. – user2126752

+1

См. Http://docs.python.org/2/tutorial/floatingpoint.html. Поплавки Python имеют 53 бит точности, поэтому просить что-либо о 15 значащих цифрах бессмысленно. –

0

Я думал, что ваш вопрос, https://stackoverflow.com/questions/15709496 (теперь закрыт), был действительно интересным. Было жаль, что он закрыт, поэтому я продолжу это упражнение и опубликую его в следующем блоге: http://nickburns2013.wordpress.com/2013/04/01/3d-water-model/. Не стесняйтесь комментировать/добавлять бит и куски.

Это совершенно не связано с этим вопросом. Извиняюсь перед тем, кто следит за этой нитью.

Смежные вопросы