Я использовал fsolve, чтобы найти нули примера синусовой функции и отлично работал. Однако я хотел сделать то же самое с набором данных. Два списка поплавков, затем преобразованные в массивы с numpy.asarray(), содержащие значения (x, y), а именно: «t» и «ys».Python fsolve не принимает массив поплавков. Как его реализовать?
Хотя я нашел related questions, мне не удалось реализовать предоставленный в них код, поскольку я пытаюсь показать здесь. Наши интересующие массивы хранятся в 2D-списке (данные [i] [j], где «i» соответствует переменной (например, данные [0] == t == time == x values), а «j» - значения указанной переменной вдоль оси х (например, данные [1] == Force). Имейте в виду, что каждый из данных [I] представляет собой массив поплавки.
Не могли бы вы предложить пример кода, который принимаетдва входы (две упомянутые массивы) и возвращает его пересекающиеся точки с определенной функцией (например, «у = 0»).
Я включил некоторые тесты я сделал в отношении других связанных с этим вопросом. (@HYRY ' s ответ)
Я не думаю, что это релевантно, но я использую Spyder через Anaconda.
Заранее благодарен!
"""
Following the answer provided by @HYRY in the 'related questions' (see link above).
At this point of the code, the variable 'data' has already been defined as stated before.
"""
from scipy.optimize import fsolve
def tfun(x):
return data[0][x]
def yfun(x):
return data[14][x]
def findIntersection(fun1, fun2, x0):
return [fsolve(lambda x:fun1(x)-fun2(x, y), x0) for y in range(1, 10)]
print findIntersection(tfun, yfun, 0)
который возвращает следующую ошибку
File "E:/Data/Anaconda/[...]/00-Latest/fsolvestacktest001.py", line 36, in tfun
return data[0][x]
IndexError: arrays used as indices must be of integer (or boolean) type
Полный выход, как это следующим образом:
Traceback (most recent call last):
File "<ipython-input-16-105803b235a9>", line 1, in <module>
runfile('E:/Data/Anaconda/[...]/00-Latest/fsolvestacktest001.py', wdir='E:/Data/Anaconda/[...]/00-Latest')
File "C:\Anaconda\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 580, in runfile
execfile(filename, namespace)
File "E:/Data/Anaconda/[...]/00-Latest/fsolvestacktest001.py", line 44, in <module>
print findIntersection(tfun, yfun, 0)
File "E:/Data/Anaconda/[...]/00-Latest/fsolvestacktest001.py", line 42, in findIntersection
return [fsolve(lambda x:fun1(x)-fun2(x, y), x0) for y in range(1, 10)]
File "C:\Anaconda\lib\site-packages\scipy\optimize\minpack.py", line 140, in fsolve
res = _root_hybr(func, x0, args, jac=fprime, **options)
File "C:\Anaconda\lib\site-packages\scipy\optimize\minpack.py", line 209, in _root_hybr
ml, mu, epsfcn, factor, diag)
File "E:/Data/Anaconda/[...]/00-Latest/fsolvestacktest001.py", line 42, in <lambda>
return [fsolve(lambda x:fun1(x)-fun2(x, y), x0) for y in range(1, 10)]
File "E:/Data/Anaconda/[...]/00-Latest/fsolvestacktest001.py", line 36, in tfun
return data[0][x]
IndexError: arrays used as indices must be of integer (or boolean) type
Можете ли вы добавить немного больше подробностей о том, что произошло, когда вы пытались использовать код из связанных вопросов? Не полные следы стека или такие, но только что-то, чтобы дать представление о том, почему это могло бы не сработать. –
Отредактировано. Надежда теперь понятна. –
Вы индексируете массив с помощью 'x', который представляет собой массив с плавающей запятой. Поплавки как индексы массивов не имеют смысла. – Evert