Я очень новый пользователь Python. Я пытаюсь вычислить суммирующий ряд.
У меня есть таблица со значениями (см. Ниже) для a_(ij) с p = 10.
data = [["a_{ij}", "j=0", "j=1", "j=2", "j=3"],
["i=1", 4.3, 8.3, 2.9, `1.3],
["i=2", 1.4, 4.7, 6,5, 3.2]]
a_(ij) j = 0 j = 1 j = 2 j = 3
i = 1 4.3 8.3 2.9 1.3
i = 2 1.4 4.7 6.5 3.2
.
.
i = 20 8.34 2.13 7.93 6.322
Вместо того, чтобы писать код отдельно для каждого значения y.
# For i = 1
y_1 = 4.3*10**0 + 8.3*10**1 + 2.9*10**2 + 1.3*10**3
Есть ли более простой способ сэкономить время?
Что такое a_(ij), это массив? Как хранятся ваши данные для таблицы? Если вы не знакомы с массивами / списками, вы должны прочитать о них и знать, что вы можете вкладывать их друг в друга.
Добро пожаловать в StackOverflow. Пожалуйста, прочтите и следуйте инструкциям по публикации в справочной документации, как было предложено при создании этой учетной записи. Здесь применяется Минимальный, полный, проверяемый пример. Мы не сможем эффективно помочь вам, пока вы не опубликуете свой код MCVE и точно не опишете проблему. Мы сможем вставить ваш опубликованный код в текстовый файл и воспроизвести описанную вами проблему.
A_ (ji) - это просто заголовок моей таблицы. Первая строка и столбец являются заголовком таблицы.
Кстати, ваш пример расчета y_1 = 4.3*10**4.3 + 8.3*10**8.3 + 2.9*10**2.9 + 1.3*10**1.3 указывает на то, что вы хотите вычислить p в степени a_(ij), а не в степени j, на что указывает опубликованное вами уравнение. Какой показатель правильный?
Спасибо за @blhsing за указание на мою ошибку. Это под силу j
@ Герцогиня, я вижу. Я обновил свой ответ ниже, чтобы отразить ваше исправление.
@Duchess Кроме того, опубликованное вами уравнение указывает на то, что индекс суммирования начинается с 1, а не с 0, но ваш расчет показывает, что вы хотите, чтобы он начинался с 0. Какая нижняя граница верна?
@blhsing, нижняя граница начинается с нуля.
@ Герцогиня, я вижу. Тогда уравнение на изображении неверно.
@Duchess Я только что понял, что zip и starmap не нужны и их можно заменить простым map. Я отредактировал свой ответ, чтобы он стал чище.






Сохраните a_ (ij) как матрицу. Либо сделайте его 2D-массивом, либо используйте библиотеку тупой и сделайте его матрицей numpy.
Пример 2D-массива:
a = [[4.3, 8.3, 2.9, 1.3],
[1.4, 4.7, 6.5, 3.2],
# you've indicated more lines will go here
[8.34, 2.13, 7.93, 6.322]]
Если a - это что-то, что может быть сгенерировано функцией, я бы рекомендовал сгенерировать ваш 2D-массив таким образом, а не вручную вводить значения.
Затем вы можете реализовать свою формулу как функцию:
def y(i):
p = 10
total = 0
for j in range(1,4):
total += a[i][j] * p**j
return total
Теперь вы можете получить значения y для любого значения i, которое вам нравится, вызвав функцию, например. y(1) даст значение y для i = 1.
Вы также можете сгенерировать массив для y (если вы часто повторно используете одно и то же значение y, ваш код будет работать быстрее, если вы сохраните его в кэше в массиве вместо того, чтобы каждый раз пересчитывать y).
Я пробовал ваш код, но когда мне нужно значение y(1), возвращаемое мне значение неверно по сравнению с ручным расчетом.
Проверяйте единичные ошибки (Python имеет индекс 0, то есть если a=[1,2,3,4], a[0] = 1, a[1] = 2 и т. д.). Обратите внимание, что на основе суммирования j от 1 до 3, показанного на вашем изображении, вы получите использовать только значения в последних 3 столбцах a, что, на мой взгляд, немного странно и несовместимо с вашими расчетами. Мое предложение состоит в том, чтобы иметь a как 2D-массив и y как функцию. Точная реализация этого вам решать.
Вот чистое решение:
>>> a = [
... [4.3, 8.3, 2.9, 1.3],
... [1.4, 4.7, 6,5, 3.2]
... ]
>>> p = 10.0
>>> import operator
>>> [sum(map(operator.mul, i, map(p.__pow__, range(len(i))))) for i in a]
[1677.3, 37648.4]
Замените zip на izip и импортируйте izip из itertools, если вы используете python 2.7.
И вот результат ручного расчета, который вы разместили для сравнения:
>>> 4.3*10**0 + 8.3*10**1 + 2.9*10**2 + 1.3*10**3
1677.3
Можете ли вы опубликовать больше кода, чтобы мы знали, как хранится таблица и т. д.?