首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >InterpolationOrder插值选项的怪异行为

InterpolationOrder插值选项的怪异行为
EN

Stack Overflow用户
提问于 2011-10-10 08:26:01
回答 2查看 473关注 0票数 4

在尝试重新创建由NDSolve生成的NDSolve时,NDSolveInterpolationOrder选项遇到了非常奇怪的问题。考虑下面的InterpolationFunction (一个示例函数从文件中):

代码语言:javascript
运行
复制
ifun = First[
  x /. NDSolve[{x'[t] == Exp[x[t]] - x[t], x[0] == 1}, x, {t, 0, 10}]]

现在让我们试着重建它。以下是数据:

代码语言:javascript
运行
复制
Needs["DifferentialEquations`InterpolatingFunctionAnatomy`"]
data = Transpose@{InterpolatingFunctionGrid[ifun], 
   InterpolatingFunctionValuesOnGrid[ifun]};

这是InterpolationOrder

代码语言:javascript
运行
复制
interpolationOrder = InterpolatingFunctionInterpolationOrder[ifun]
(*=> {3}*)

现在我们尝试构造InterpolatingFunction

代码语言:javascript
运行
复制
Interpolation[data, InterpolationOrder -> interpolationOrder];

并获得错误Message

插值::inord:选项InterpolationOrder -> {3}的值应该是非负机器大小的整数或长度等于维数的整数列表,1. >>。

但是,如果我们手动指定InterpolationOrder,则可以:

代码语言:javascript
运行
复制
Interpolation[data, InterpolationOrder -> {3}]
(*=> InterpolatingFunction[{{0.,0.516019}},<>]*)

有人能解释为什么InterpolationOrder -> interpolationOrder不能工作,而InterpolationOrder -> {3}工作,尽管interpolationOrder必须用{3}替换,然后才能调用Interpolation (根据标准评价序列 )

这个问题出现在Mathematica 7.0.1和8.0.1中,而不在Mathematica5.2中。

更新

我找到了一个解决这个问题的方法:

代码语言:javascript
运行
复制
Interpolation[data, 
 ToExpression@ToString[InterpolationOrder -> interpolationOrder]]

按预期工作。

尽管Rule[InterpolationOrder,interpolationOrder]Rule[InterpolationOrder,{3}]的计算结果是相同的,但它们的内部结构似乎不同:

代码语言:javascript
运行
复制
ByteCount // Attributes
ByteCount[InterpolationOrder -> interpolationOrder]
ByteCount[InterpolationOrder -> {3}]
Order[InterpolationOrder -> interpolationOrder, 
 InterpolationOrder -> {3}]

(*=> 
{Protected}
192
112    
0
*)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-10 10:13:27

我似乎找到了这种行为的原因。这是因为InterpolatingFunctionInterpolationOrder函数返回PackedArray

代码语言:javascript
运行
复制
Developer`PackedArrayQ@InterpolatingFunctionInterpolationOrder[ifun]
(*=> True*)

我们可以自己将{3}转换为PackedArray

代码语言:javascript
运行
复制
Interpolation[data, 
  InterpolationOrder -> Developer`ToPackedArray@{3}];

(*=> gives the error Message*)

因此,原因是Interpolate不支持PackedArray作为InterpolationOrder选项的值。解决办法是手动解压它:

代码语言:javascript
运行
复制
Interpolation[data, 
 InterpolationOrder -> Developer`FromPackedArray@interpolationOrder]
(*=> InterpolatingFunction[{{0.,0.516019}},<>]*)
票数 5
EN

Stack Overflow用户

发布于 2011-10-10 10:13:53

非常奇怪的行为。有点像

代码语言:javascript
运行
复制
a = {3};
Interpolation[data, InterpolationOrder -> a]

工作正常,??interpolationOrderOwnValues[interpolationOrder]似乎都表明interpolationOrder{3}是相等的。更奇怪的是,这似乎确实奏效了。

代码语言:javascript
运行
复制
interpolationOrder = 2 InterpolatingFunctionInterpolationOrder[ifun]/2
Interpolation[data, InterpolationOrder -> interpolationOrder]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7710168

复制
相关文章

相似问题

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