Ввод массива в качестве начального предположения в функции scipy newton - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь использовать функцию newton из scipy в фрагменте кода, и я хотел бы ввести массив в качестве первоначального предположения. С веб-сайта scipy: Scipy заявляет, что функция newtons может принимать ndarray в качестве начального предположения

Причина этого в том, что в сложном нелинейном уравнении, которое я пытаюсь решить, функция newton работает только в том случае, если первоначальное предположение близко к фактическому значению, поэтому мне нужно использовать массив значений, близких к истинным значениям, чтобы заставить его работать. Однако, когда я пытаюсь ввести массив в качестве начального предположения через:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import newton

#Declaring frequency and wave vector arrays
w_array = np.linspace(0.1,3,1000)*10**15
k_array = np.array([])

#Declaring variables
p = 2.85*10**15
e1=1
c=300000000

def twolayer(k):
    e2 = 3.43-(p**2)/(w**2 - (1j*gamma*w))
    result = ((w/c)*(((e2*e1)/(e2+e1))**0.5))-k
    return result

#Loop that uses secant method for each value of omega to find solutions for k
for w in w_array:
    gamma = 2.23 * 10**14
    k_array = np.append(k_array,newton(twolayer,w_array[w]))

#Plotting
plt.figure(dpi=100)
plt.plot(k_array.real,w_array)
plt.xlabel('Wave vector k')
plt.ylabel('Frequency ω')

, я получаю следующую ошибку:

IndexError: только целые числа, срезы (:), многоточие ( ...), numpy .newaxis (None) и целочисленные или логические массивы являются допустимыми индексами

Есть идеи, как я могу заставить это работать?

1 Ответ

0 голосов
/ 27 мая 2020

Используйте:

for w in w_array:
    gamma = 2.23 * 10**14
    k_array = np.append(k_array,newton(twolayer,w)

вместо

for w in w_array:
    gamma = 2.23 * 10**14
    k_array = np.append(k_array,newton(twolayer,w_array[w]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...