【问题标题】:Symbolically computing the input of an interpolation function?象征性地计算插值函数的输入?
【发布时间】: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,而这个200299 是导致任何人复制粘贴它的错误的原因。那么freeB 没有定义。作为一般规则,通过复制粘贴到新的 Sage 会话中,然后从该会话中复制粘贴确切的输入、输出和错误消息,始终确保问题是正确提出的。也许freeB 是什么并不重要,重要的是其他人能否重现错误以探索并帮助解决问题。

标签: python numpy scipy interpolation sage


【解决方案1】:

使用 numpy 和 scipy 时,更喜欢 Python 类型而不是 Sage 类型。

使用 Python 整数和浮点数代替 Sage 整数和实数。

也许你可以像这样修复你的代码。

from scipy.interpolate import InterpolatedUnivariateSpline as IUspline
import numpy as np

# Generate interpolation object
xint = srange(30,200,step=.1)
xint = [float(x) for x in xint]
val = [float(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)

【讨论】:

  • 生成插值对象不是问题,因此将 xint 转换为 python 整数不会改变任何内容。真正的问题是插值对象将只接受 array_like 对象,这使得无法将符号传递给f 以用于解决关系eq_m(x) = eq_G(39.9) == f(x) 中的x
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2021-11-15
  • 1970-01-01
相关资源
最近更新 更多