1

我正在熟悉Python 中的fsolve,但在我的非线性方程组中包含可调参数时遇到了麻烦。这个链接似乎回答了我的问题,但我仍然得到错误。下面是我的代码:

 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被明确定义为参数时。如何包含此可调参数?

4

1 回答 1

0

所以在发帖之前,我应该多花一点时间来玩它。这是我发现的

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)以至于它不知道我试图将最初的猜测应用于什么。

无论如何,我希望这对某人有所帮助。

编辑:当我在这里时,测试功能是一个半径可调的圆和一条在两点相交的线。

红色: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]]
于 2021-04-26T21:41:17.207 回答