Как включить настраиваемый параметр в fsolve?

Я знакомлюсь с fsolve в Python, и у меня возникли проблемы с включением регулируемых параметров в мою систему нелинейных уравнений. Эта ссылка, кажется, отвечает на мой вопрос, но я все равно получаю ошибки. Ниже мой код:

 import scipy.optimize as so

 def test(x,y,z):
    
     eq1 = x**2+y**2-z
     eq2 = 2*x+1
    
     return [eq1,eq2]

     z = 1                                         # Ajustable parameter
     sol = so.fsolve(test , [-1,2] ,args=(z))      # Solution Array
     print(sol)                                    # Display Solution

Результат дает

    TypeError: test() missing 1 required positional argument: 'z'

Когда z четко определен как аргумент. Как мне включить этот регулируемый параметр?


person Trevor O.    schedule 25.04.2021    source источник


Ответы (1)


Так что, прежде чем размещать здесь, мне следовало потратить немного больше времени на то, чтобы поиграть с ним. Вот что я нашел

import scipy.optimize as so
import numpy as np

def test(variables,z): #Define function of variables and adjustable arg
    
    x,y = variables     #Declare variables
    
    eq1 = x**2+y**2-1-z #Equation to solve #1
    eq2 = 2*x+1         #Equation to solve #2
    
    return [eq1,eq2]    #Return equation array

z = 1                                       #Ajustable parameter
initial = [1,2]                             #Initial condition list                          
sol = so.fsolve(test , initial, args = (z)) #Call fsolve
print(np.array(sol))                        #Display sol  

С выходом

[-0.5         1.32287566]

Я не умею анализировать код, но я думаю, что моя проблема заключалась в том, что я перепутал свои переменные и аргументы в test(x,y,z), так что он не знал, что я пытался применить первоначальное предположение к.

В любом случае, я надеюсь, что это кому-то помогло.

edit: Пока я здесь, тестовая функция представляет собой круг регулируемого радиуса и линию, пересекающую его в двух точках.

Красный: x ^ 2 + y ^ 2-2, Синий: 2x + 1

Если вы хотите найти положительные и отрицательные решения, вам нужно будет передать свое первоначальное предположение в виде массива (кто-то задал аналогичный вопрос здесь). Вот обновленная версия

z = 1
initial = [[-2,-1],[2,1]]
sol = []                            
for i in range(len(initial)): 
   sol.append(so.fsolve(test , initial[i], args = (z))) 
print(np.array(sol)) 

На выходе

[[-0.5        -1.32287566]
 [-0.5         1.32287566]]
person Trevor O.    schedule 26.04.2021