Helpers - компьютеры, интернет, программирование

Передать список значений в аргумент SciPy fsolve

У меня есть следующая функция:

def equation1(xy, d=7.62, G=8.2728, rhop=7.51, ut=399):
    ep, uc = xy     # define variables
    g = 981         # acceleration due to gravity, cm/s^2

    f1 = 2*g*d*((ep**-4.7) - 1) - 0.01*(uc/ep - ut)**2
    f2 = G - (uc/ep - ut)*rhop*(1 - ep)
    return f1, f2

где я решаю для ep и uc, используя fsolve в SciPy:

ep1, uc1 = fsolve(equation1, [1, 500])

Вместо того, чтобы определять одно значение для G, я хотел бы решить для ep и uc значения диапазона G, такие как G = [8, 10, 12]. Когда я передаю список значений для G, я получаю сообщение об ошибке при установке элемента массива с последовательностью.

Можно ли использовать fsolve, где одним из аргументов является список или массив значений?

17.03.2017

  • Вы хотите решить ep,uc для каждого значения G? В этом случае вам придется перебирать эти значения и вызывать fsolve для каждого случая. 18.03.2017
  • @AndrasDeak Да, я хочу найти ep, uc для каждого значения G. 18.03.2017

Ответы:


1

вы можете сохранить G в качестве параметра для equation1 и передать его через fsolve (используя его параметр args) как:

from scipy.optimize import fsolve

def equation1(xy, G, d=7.62, rhop=7.51, ut=399):
    ep, uc = xy     # define variables
    g = 981         # acceleration due to gravity, cm/s^2

    f1 = 2*g*d*((ep**-4.7) - 1) - 0.01*(uc/ep - ut)**2
    f2 = G - (uc/ep - ut)*rhop*(1 - ep)
    return f1, f2


for G in [8, 10, 12]:
    ep1, uc1 = fsolve(equation1, [1, 500], (G, ))
    print(G, ep1, uc1)

это дает на моей машине:

8 0.994582431487 592.401268397
10 0.993718674117 607.148953105
12 0.992912345764 620.018209488
18.03.2017
  • Нужно ли передавать G внутри кортежа? Поскольку цикл for передает одно значение на каждой итерации, кажется, что кортеж не нужен для одного аргумента. 18.03.2017
  • @wigging с передачей только G тоже работает, я использовал кортеж просто для того, чтобы показать, куда нужно вставить возможные дополнительные аргументы... 18.03.2017
  • Спасибо за помощь, ваш ответ - это то, что я искал. 18.03.2017

  • 2

    Если я запускаю вашу функцию с помощью:

    In [83]: ep1, uc1 = fsolve(equation1, [1, 500],args=(7.62, [8,10,12]))
    ...
    ValueError: setting an array element with a sequence.
    

    Но посмотрите на стек вызовов. Это длинно, но эта линия выделяется

    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
    

    Это делает тестовый вызов вашей функции.

    Так, например:

    In [121]: x0=np.array([1,500])
    In [122]: numinputs=2
    In [123]: args = (1,8)     # scalar G
    In [124]: np.atleast_1d(equation1(*((x0[:numinputs],) + args)))
    Out[124]: array([-102.01,    8.  ])
    
    In [125]: args = (1,[8,10])    # list G
    In [126]: np.atleast_1d(equation1(*((x0[:numinputs],) + args)))
    ....
    ValueError: setting an array element with a sequence.
    

    Глядя конкретно на то, что производит ваша функция:

    In [127]: equation1(*((x0[:numinputs],) + args))
    Out[127]: (-102.01000000000001, array([  8.,  10.]))
    

    Он не может превратить этот кортеж в допустимый массив 1d, отсюда и сообщение об ошибке.

    Обратите внимание, что аргументы вашей функции:

    In [128]: ((x0[:numinputs],) + args)
    Out[128]: (array([  1, 500]), 1, [8, 10])
    

    fsolve передает весь кортеж args вашей функции. Он не перебирает массивы или списки.

    Итак, вы хотите fsolve для различных значений G, вам нужно выполнить итерацию самостоятельно. fsolve (и большинство других функций scipy) не сделают этого за вас.

    18.03.2017
    Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..