Python-Integrate затем сохраните текстовый файл - PullRequest
0 голосов
/ 28 октября 2011

Для всех:

Этот вопрос относится к некоторым исследованиям РС, которые я делаю.

То, что я хочу сделать, на вид просто.У меня есть текстовый файл значений (время, ..... значения).Затем я хочу интегрировать от 0 до этих значений за все время, а затем сохранить это значение в текстовом файле.

from numpy import *
from pylab import *
import os, sys, shutil
import math

#######################

#Load Data
data = loadtxt('wh.txt')

#Open file to save plots to
shutil.rmtree("wh_files")
os.makedirs("wh_files")
os.chdir("wh_files")

for i in range(0,100,1):
   int = trapz(data[i,:],axis=0)
   print int
   savetxt('int.txt', int)

При запуске этого я получаю следующую ошибку:

  File "integral.py", line 19, in 
    savetxt('int.txt', int)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/numpy/lib/npyio.py", line 960, in savetxt
    ncol = X.shape[1]
IndexError: tuple index out of range

Я пытался решить эту проблему несколько дней подряд, но пока не нашел решения.Я ценю любую помощь / комментарии, которые вы можете дать.

1 Ответ

2 голосов
/ 28 октября 2011

Значение int - это число с плавающей запятой, но savetxt требует массив.Вы хотите создать пустой массив для всех результатов интеграции, а затем сохранить его в конце, используя savetxt.Я думаю, что-то вроде этого должно сработать:

int_array = apply_along_axis(trapz, 0, data)
savetxt('int.txt', int_array)

Имейте в виду, что это (вместе с вашим оригинальным примером) будет суммировать поля времени, а не интегрировать по времени.Это даст только действительные результаты, если интервал вдоль оси x равен 1. В противном случае вы захотите сделать что-то вроде этого:

t = data[0,:]
int_array = apply_along_axis(trapz, 0, data[1:,:], t)
savetxt('int.txt', int_array)

При условии, что поля времени являются числовыми.

edit : дальнейшее объяснение 2-го раздела кода приведено ниже.

Вы используете трапециевидное правило для интегрирования множества значений, которое представляет собой метод аппроксимации интегрирования, который работает путем суммирования среднего значения для последовательногоЗначения y на кривой, умноженные на изменение x между двумя значениями y.Это равносильно вычислению площади трапеции, соединяющей два значения y и ось X, например:

Trapezoid Rule

Это не совсем ясно из вашего вопроса, но этоКазалось, что вы интегрируете значения по времени, так что ось X будет представлять время.Значения x должны быть включены, чтобы получить правильную площадь каждой трапеции (площадь каждой трапеции равна (x 2 - x 1 ) * (y 2 + y 1 ) / 2, а окончательный результат интегрирования представляет собой сумму всех таких областей).

Самый простой способ включить эти значения оси x - передать его в функцию trapz в качестве параметра x (см. строка документа ).В приведенном выше примере я использовал t = data[0,:] в качестве массива значений x, например.

Еще одно предупреждение: если все интервалы между значениями x одинаковы (так что x 2 - x 1 - это константа), вы можете сэкономить некоторые вычисления, вытащив их из суммы и просто умножив их в конце.Эта функция доступна через функцию trapz с параметром dx.Так, если вы измеряете время, например, каждые 30 секунд, вы можете заменить 2-ю строку в моем 2-м примере следующим образом:

int_array = apply_along_axis(trapz, 0, data[1:,:], None, 30)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...