【发布时间】:2015-04-28 20:35:34
【问题描述】:
我有一个相当复杂的函数H(x),我正在尝试求解x 的值,使得H(x) = constant。我想使用从离散间隔生成的插值对象和 H(interval) 的相应输出来执行此操作,其中其他输入保持不变。我表示插值对象f。
我的问题是插值对象的调用函数接受一个array_like,所以传递一个符号给f(x)来使用sage的求解器方法是不可能的。关于如何解决这个问题的任何想法?
我有插值函数f。我想解方程f(x) == sageconstant forx.
from scipy.interpolate import InterpolatedUnivariateSpline as IUspline
import numpy as np
#Generating my interpolation object
xint = srange(30,200,step=.1)
val = [H(i,1,.1,0,.2,.005,40) for i in srange(30,299,step=.1)]
f = IUspline(xint,val,k=4)
#This will yield a sage constant
eq_G(x) = freeB - x
#relation that I would like to solve
eq_m(x) = eq_G(39.9) == f(x)
m = solve(eq_m(x),x)
上面的代码(更具体的f(x))生成
"TypeError: 无法将数组数据从 dtype('0') 转换为 dtype('float64') 根据“安全”规则。
编辑:任何函数H(x) 都会导致相同的错误,因此H(x) 是什么并不重要。为简单起见(当我说H 很复杂时,我不是在开玩笑),试试H(x) = x。然后该块将读取:
from scipy.interpolate import InterpolatedUnivariateSpline as IUspline
import numpy as np
#Generating my interpolation object
xint = srange(30,200,step=.1)
H(x) = x
val = [H(i) for i in srange(30,299,step=.1)]
f = IUspline(xint,val,k=4)
#This will yield a sage constant
eq_G(x) = freeB - x
#relation that I would like to solve
eq_m(x) = eq_G(39.9) == f(x)
m = solve(eq_m(x),x)
【问题讨论】:
-
请提供允许其他人重现错误的代码。当前提供的代码有
srange(30, 200, step=.1)用于xint,但srange(30, 299, step=.1)用于val,而这个200与299是导致任何人复制粘贴它的错误的原因。那么freeB没有定义。作为一般规则,通过复制粘贴到新的 Sage 会话中,然后从该会话中复制粘贴确切的输入、输出和错误消息,始终确保问题是正确提出的。也许freeB是什么并不重要,重要的是其他人能否重现错误以探索并帮助解决问题。
标签: python numpy scipy interpolation sage