Python-интегрировать, затем сохранить текстовый файл

#python #numpy

#python #numpy

Вопрос:

Для всех:

Этот вопрос относится к некоторым исследованиям MS, которые я провожу.

То, что я хочу сделать, кажется простым. У меня есть текстовый файл значений (время, ….. значения). Затем я хочу интегрировать от 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)
 

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

 Файл "integral.py ", строка 19, в
savetxt('int.txt ', int)
 Файл "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/numpy/lib/npyio.py ", строка 960, в формате savetxt
ncol = X.форма[1]
Ошибка индекса: индекс кортежа выходит за пределы диапазона

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

Комментарии:

1. В int = trapz(data[i,:],axis=0) вы имели в виду иметь data[i:] вместо data[i,:] ?

2. Кроме того, иметь переменную с именем, подобным одному из стандартных типов ( int ), вероятно, является плохой идеей.

Ответ №1:

Значение int является плавающим, но savetxt для него требуется массив. Вы хотите создать массив numpy для всех результатов интеграции, а затем сохранить его в конце с помощью 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)
 

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

редактировать: далее следует объяснение 2-го раздела кода.

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

Правило трапеции

Из вашего вопроса не совсем понятно, но казалось, что вы интегрировали значения во времени, чтобы ось 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)
 

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

Комментарии:

1. Большое вам всем спасибо за совет. Уилл, ты можешь объяснить последний фрагмент кода, который ты написал? Я не уверен, что вы имеете в виду. @Will

2. Большое спасибо за помощь! Я не очень хорошо справился со своим вопросом. На самом деле я интегрирую объем только каждый раз, а не по времени. т. е. до 1,0 с у меня есть ряд значений, которые представляют высоту поверхности воды, затем в течение 1,5 с у меня есть новая серия значений, представляющих новую конфигурацию поверхности. Я беру эти значения, а затем вижу, как они меняются с течением времени. Я действительно ценю время, которое вы потратили на ответ на этот вопрос.