Использование списка с плавающей точкой для цикла - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь запустить алгоритм Рунге-Кутты для аппроксимации дифференциального уравнения. Я хочу go просмотреть список значений постоянной переменной A в функции и получить алгоритм l oop go для каждого элемента в списке и создать график. Я продолжаю получать сообщение о том, что «индексы списка должны быть целыми числами или ломтиками, но не плавающей точкой». Я пытался преобразовать числа в списке в целые доли друг от друга, но это тоже не сработало. Я в основном не уверен, как обойти эту ошибку, так как некоторые исправления, которые я обнаружил, не сработали, вот мой код:

import numpy as np
import matplotlib.pyplot as plt
from math import pi
from numpy import arange
from matplotlib.pyplot import plot,show

wo = 1
w = 2       #defining wo, w, g1, Amplitude and steps
h = 0.001
g1 = 0.2
A = [0.1,0.25,0.5,0.7,0.75,0.85,0.95,1.00,1.02,1.031,1.033,1.035,1.05]
for item in list(A):                #Converting list items into Float values
    [float(i) for i in A]

xpoints = arange(0,100,h)
tpoints = []
zpoints = []
t=0
x = 0
z = pi/2
for i in A:                               #Calls for items in Amplitude list to run algorighm
    def F(t, z, x):                             #Defining the differential equation
        return -g1 * z - (wo ** 2 + 2 * A[i] * np.cos(w * t)) * np.sin(x)
    for x in xpoints:
        tpoints.append(t)
        zpoints.append(z)
        m1 = z*h
        k1 = h*F(t,z,x)    #setting up the runge-kutta algorithm
        m2 = h*(z+(k1/2))
        k2 = h*F(t+0.5*m1,z+0.5*m1,x+0.5*h)
        m3 = h*(z+0.5*k2)
        k3 = h*F(t+0.5*m2,z+0.5*m2,x+0.5*h)
        m4 = h*(z+0.5*k3)
        k4 = h*F(t+0.5*m3,z+0.5*m3,x+0.5*h)
        t += (m1+2*m2+2*m3+m4)/6
        z += (k1+2*k2+2*k3+k4)/6
    A += 1
plot(xpoints,zpoints)

Ответы [ 2 ]

4 голосов
/ 31 марта 2020

Проблема не в том, что сами числа должны быть преобразованы. Обратите внимание, как вы выполняете итерацию с for i in A:. Это означает, что я фактическое значение, а не индекс. Поэтому, когда вы используете A[i], вы пытаетесь go получить индекс 0,1 А. Вместо этого просто замените A[i] на i в строке внизу этого фрагмента.

A = [0.1,0.25,0.5,0.7,0.75,0.85,0.95,1.00,1.02,1.031,1.033,1.035,1.05]
...
for i in A:      
    def F(t, z, x):                             
        return -g1 * z - (wo ** 2 + 2 * A[i] * np.cos(w * t)) * np.sin(x)
1 голос
/ 31 марта 2020

Поскольку значение i является элементом A. Если вы хотите l oop индексировать по индексу в списке A:

for i in range(len(A))

, это работает.

На этот раз вы получите ошибку в A + = 1. Я думаю, что это место будет i + = 1.

...