Wolfram mathematica 具有涉及单位的插值的FindRoot

Wolfram mathematica 具有涉及单位的插值的FindRoot,wolfram-mathematica,interpolation,Wolfram Mathematica,Interpolation,使用Mathematica 10,我定义了两个涉及单位的线性插值函数:第一个是我自己编写的,第二个是内置函数 我需要做的是使用一个简单的FindRoot函数,但是第一个函数很好用,第二个却不行。作为一个例子,我写了一个没有任何具体意义的简单示例,只是为了说明问题 我需要找到一种使用FindRoot函数和内置插值的方法 In[1]:= m = Quantity["Meters"]; In[2]:= kg = Quantity["Kilograms"]; In[3]:= linterp[x_, x0

使用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.}

首先要考虑到插值函数只在数据指定的区域内工作,在示例中是从2到15,所以在FindRoot中不能从1开始

恐怕不能直接用FindRoot中的单位来使用插值函数。但是如果你想保留所有的单位,你总是可以这样做(我同意……看起来很难看):


此外,如果您只使用多项式数据,那么考虑使用与FindRoot无缝连接的插值多项式(因为它创建原始方程),正如您的函数LtIMP.

尝试定义<代码> f3[Xi//Noimiq[x] ]:=数量级[F2[量[x,kKy] ] -6 M] < /代码>,并将其传递给<代码> FindRoot < /代码>。
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]]