首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将numpy ndarray作为函数的输入传递

将numpy ndarray作为函数的输入传递
EN

Stack Overflow用户
提问于 2019-06-27 00:32:26
回答 2查看 816关注 0票数 0

我想用数值方法来求解一个非线性方程组,并把非线性非线性射线作为输入。考虑下面的任意代码:

代码语言:javascript
运行
AI代码解释
复制
import numpy as np
from scipy.optimize import fsolve

def eqs(A, B, C, D):
    eq1 = (A - B * np.sin(C)).tolist()
    eq2 = [5 * B + D * np.sum(A * np.cos(C))]
    return eq1 + eq2

n = 3

A = np.zeros((n))
A0 = np.random.rand(n)
B = 0.0
B0 = np.random.rand(1)[0]

C = np.random.rand(n)
D =  np.random.rand(1)[0]

sol = fsolve(func = eqs, x0 = [A0, B0], args = [C, D])

这导致了

缺少必要的位置参数

错误并将函数更改为:

代码语言:javascript
运行
AI代码解释
复制
def eqs(A, B, C, D):
    eq1 = A - B * np.sin(C)
    eq2 = C[0] * B + D * np.sum(A * np.cos(C))
    return [eq1, eq2]

也无济于事。然而,我非常怀疑这一错误是否与通过ndarray有关。一种方法可以是将所有的ndarray来回更改为python列表。但是那样我就不能使用像np.sin()这样的numpy的矢量化函数.

如果你能帮我知道该怎么做,我将不胜感激。

上面的P.S.方程是任意的,它们可能根本没有解。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-27 02:31:28

检查这是否解决了你的方程式:

代码语言:javascript
运行
AI代码解释
复制
import numpy as np
from scipy.optimize import fsolve

def eqs(X, Y):
    A, B = X[:3], X[3]
    C, D = Y[:3], Y[3]
    eq1 = A - B * np.sin(C)
    eq2 = C[0] * B + D * np.sum(A * np.cos(C))
    return np.append(eq1, eq2)

n = 3

A = np.zeros((n))
A0 = np.random.rand(n)
B = 0.0
B0 = np.random.rand(1)[0]

C = np.random.rand(n)
D =  np.random.rand(1)[0]

sol = fsolve(func = eqs, x0 = np.append(A0, B0), args = np.append(C, D))
sol

输出:

代码语言:javascript
运行
AI代码解释
复制
array([ 0.e+000, -1.e-323,  5.e-324, -1.e-323])
票数 2
EN

Stack Overflow用户

发布于 2019-06-27 08:48:33

这些scipy.optimize函数需要一个具有签名的函数,如

代码语言:javascript
运行
AI代码解释
复制
f(x, *args)

x是一个数组(通常是1d),它的求解程序将发生变化;args是刚刚从外部传递过来的参数的元组。

更改您的eqs以适应此模式

代码语言:javascript
运行
AI代码解释
复制
In [11]: def eqs(X, C, D): 
    ...:     A, B  = X[:-1], X[-1] 
    ...:     eq1 = (A - B * np.sin(C)).tolist() 
    ...:     eq2 = [5 * B + D * np.sum(A * np.cos(C))] 
    ...:     return eq1 + eq2 

    ...: n = 3 
    ...: A0 = np.random.rand(n) 
    ...: B0 = np.random.rand(1) 
    ...:  
    ...: C = np.random.rand(n) 
    ...: D =  np.random.rand(1)  

eqs进行测试调用

代码语言:javascript
运行
AI代码解释
复制
In [12]: eqs(np.concatenate((A0,B0)),C,D)                                                            
Out[12]: 
[-0.28460532658572657,
 -0.03649115738682615,
 0.7625781482352719,
 array([5.46430853])]

现在在fsolve中试一试

代码语言:javascript
运行
AI代码解释
复制
In [13]: fsolve(eqs, np.concatenate((A0,B0)), args=(C,D))                                            
Out[13]: array([0., 0., 0., 0.])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56787038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档