2013-03-02 4 views
2

다른 연습. 이 사람은 x-2 = ln (x)에 대한 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]를 인쇄하면 일반적으로 가장 가까운 10 진수 "0"(코드 끝 부분 근처)에서 끝나는 결과가 생성됩니다. 감사.

+0

당신이 시행하고자하는 번호는 무엇이든 :'round (n, sigfig)'. –

+0

문제는 이미 코딩했는데 작동하지 않는다는 것입니다. 가장 가까운 십진수 0 바로 앞에서 자릅니다. – user2126752

+0

이것은 두 가지 질문이어야합니다. 당신은 전혀 관련이없는 두 가지 다른 것을 요구하고 있습니다. –

답변

1

파이썬 형식 문자열에서 *을 C/C++과 비슷한 방식으로 사용할 수 있습니다. % 연산자가 형식 문자열에서 *을 발견하면 목록에서 정수를 찾고 형식 문자열에서 상수 인 것처럼 사용합니다. 다음은 작동한다

당신이 뭘 하려는지 : result1.23456sigdig3 인이 의지의 출력

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

경우 : 파이썬 수레가 IEEE794 double precision values을 것을

x_3 = 1.234 

주, 이는 약 15 자릿수를 의미합니다. 예를 들어 17 진수를 넘어 모두가 본질적으로 임의의 쓰레기가 얼마나

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

참고.

+0

: \t 인쇄 라운드 (resu [i], sigdig) – user2126752

+0

위의 기능은 작동하지 않습니다. sigdig = 30이면 어떤 이유로 30 개의 소수를 인쇄하지 않습니다. – user2126752

+1

http://docs.python.org/2/tutorial/floatingpoint.html을 참조하십시오. Python float에는 53 비트의 정밀도가 있으므로 유효 숫자 15자를 요구하는 것은 의미가 없습니다. –

0

귀하의 질문은 https://stackoverflow.com/questions/15709496 (현재 폐쇄되었습니다)이 정말로 흥미 롭다고 생각했습니다. 그것은 닫힌 것을 보는 것이 수치 였고, 나는 이것을 운동으로 계속할 것이며 다음 블로그에 게시 할 것입니다 : http://nickburns2013.wordpress.com/2013/04/01/3d-water-model/. 비트와 조각을 자유롭게 덧글/덧붙이십시오.

여기는이 질문과 완전히 관련이 없습니다. 이 스레드를 따르는 모든 사용자에게 사과하십시오.