FindRoot包含涉及单位的插值

时间:2014-11-17 17:45:08

标签: wolfram-mathematica interpolation

使用Mathematica 10我已经定义了两个涉及单位的线性插值函数:第一个是我自己编写的,第二个是内置函数。

我需要做的是使用一个简单的FindRoot函数,但是第一个函数运行良好,第二个函数没有。作为一个例子,我写了一个没有任何特定含义的简单示例,只是为了显示问题。

我需要找到一种方法来使用内置插值的FindRoot函数。

In[1]:= m = Quantity["Meters"];
In[2]:= kg = Quantity["Kilograms"];
In[3]:= linterp[x_, x0_, x1_, y0_, y1_] := (y0 + (y1 - y0)*(x - x0)/(x1 - x0));
In[4]:= kg1 = 2 kg; kg2 = 15 kg;
In[5]:= m1 = 3 m; m2 = 13 m;
In[6]:= f1[x_] := linterp[x, kg1, kg2, m1, m2]
In[7]:= f2[x_] := Interpolation[{{kg1, m1}, {kg2, m2}}, x, InterpolationOrder -> 1]
In[8]:= f1[7. kg]
Out[8]= Quantity[6.84615, "Meters"]
In[9]:= f2[7. kg]
Out[9]= Quantity[6.84615, "Meters"]

In[10]:= FindRoot[f1[x] == 6 m, {x, 1 kg}](*this works best*)
Out[10]= {x -> Quantity[5.9, "Kilograms"]}
In[11]:= FindRoot[f1[Quantity[x, "Kilograms"]] == 6 m, {x, 1}](*this works as well*)
Out[11]= {x -> 5.9}

In[12]:= FindRoot[f2[x] == 6 m, {x, 1 kg}](*does NOT work*)
Out[12]= {x -> Quantity[1., "Kilograms"]}
In[13]:= FindRoot[f2[Quantity[x, "Kilograms"]] == 6 m, {x, 1}](*does NOT work as well*)
Out[13]= {x -> 1.}

1 个答案:

答案 0 :(得分:0)

首先考虑插值函数仅适用于数据指定的区域,在2到15的示例中,因此在FindRoot中不能以1开头。

我担心不可能直接在FindRoot中使用InterpolationFunction与单位。但如果你想保留所有单位,你总是可以这样做(我同意......看起来很难看):

f2 = Interpolation[{{kg1, m1}, {kg2, m2}}, InterpolationOrder -> 1];

num[x_] := QuantityMagnitude[x];  (* just shorter *)
(x /. FindRoot[num@f3[x kg] == num[6 m], {x, num[3 m]}]) QuantityUnit[f3[kg1]]

此外,如果您只使用多项式数据,那么请考虑使用InterpolatingPolynomial,它与FindRoot无缝协作(因为它创建原始方程),就像您的函数linterp一样。