92 lines
2.4 KiB
Python
92 lines
2.4 KiB
Python
#! coding: utf-8
|
||
|
||
# Тестовое приложение для проекта Opal
|
||
# Вычисление значений синуса по формулам Тейлора
|
||
# Вычисляет значения для указанного диапазона с заданной точностью
|
||
# и нужным количеством шагов
|
||
|
||
import sys
|
||
import json
|
||
import time
|
||
|
||
def write(msg):
|
||
sys.stdout.write(str(msg) + '\n')
|
||
sys.stdout.flush()
|
||
|
||
def sin_taylor(x, n):
|
||
f = 1
|
||
s = 0.0
|
||
e = 1.0
|
||
x0 = x
|
||
for i in xrange(n + 1):
|
||
#print e, f, x
|
||
f *= (2 * i) * (2 * i + 1) if i else 1
|
||
s += e * x / f
|
||
x *= x0 * x0
|
||
e *= -1
|
||
return s
|
||
|
||
def answer(p, c = ''):
|
||
return json.dumps({
|
||
"answer": "ok",
|
||
"value": p,
|
||
"comment": c
|
||
})
|
||
|
||
def error(msg):
|
||
return json.dumps({
|
||
"answer": "error",
|
||
"comment": msg
|
||
})
|
||
|
||
def result(r):
|
||
return json.dumps({
|
||
"answer": "result",
|
||
"result": {
|
||
"table": [[ {"x": "double"}, {"y": "double"} ]] + r
|
||
}
|
||
})
|
||
|
||
def main():
|
||
|
||
try:
|
||
|
||
if sys.argv[1] == '-i':
|
||
|
||
with open('testt.json') as f:
|
||
d = json.load(f)
|
||
write(json.dumps(d, indent = 2))
|
||
|
||
elif sys.argv[1] == '-r':
|
||
|
||
textdata = raw_input()
|
||
data = json.loads(textdata)
|
||
|
||
if not len(data) or data[-1]['label'] != 'sintaylor':
|
||
write(error('Unknown model'))
|
||
sys.exit(1)
|
||
|
||
params = data[0]['params']
|
||
l = 0 # левая граница
|
||
r = params['r'] # правая граница
|
||
n = params['n'] # количество шагов
|
||
d = params['d'] # количество членов в разложении Тейлора
|
||
h = float(r - l) / n # шаг сетки по х
|
||
res = [] # таблица резултатов
|
||
|
||
while l <= r:
|
||
y = sin_taylor(l, d)
|
||
res.append([l, y])
|
||
write(answer(l / r, data[-1]['label']))
|
||
l += h
|
||
time.sleep(0.1)
|
||
|
||
write(result(res))
|
||
|
||
except Exception, e:
|
||
write(error('Fatal error: ' + str(e)))
|
||
sys.exit(1)
|
||
|
||
if __name__ == '__main__':
|
||
main()
|