Performance Wolfram Mathematica逆函数的性能
给定常数Performance Wolfram Mathematica逆函数的性能,performance,wolfram-mathematica,Performance,Wolfram Mathematica,给定常数 mu = 20.82; ex = 1.25; kg1 = 1202.76; kp = 76.58; kvb = 126.92; 我需要反转函数 f[Vpx_,Vgx_] := Vpx Log[1 + Exp[kp (1/mu + Vgx/(Vpx s[Vpx]))]]; 在哪里 所以我得到了一个由两个变量组成的函数,第二个变量是Vgx 我试过了 t = InverseFunction[Function[{Vpx, Vgx}, f[Vpx, Vgx]], 1, 2]; 使用t[45
mu = 20.82;
ex = 1.25;
kg1 = 1202.76;
kp = 76.58;
kvb = 126.92;
我需要反转函数
f[Vpx_,Vgx_] := Vpx Log[1 + Exp[kp (1/mu + Vgx/(Vpx s[Vpx]))]];
在哪里
所以我得到了一个由两个变量组成的函数,第二个变量是Vgx
我试过了
t = InverseFunction[Function[{Vpx, Vgx}, f[Vpx, Vgx]], 1, 2];
使用t[451,-4]
它花费了太多的时间,以至于每次我尝试它时,我都会停止评估
另一方面,只使用一个变量,一切都可以工作:
Vgx = -4;
t = InverseFunction[Function[{Vpx}, f[Vpx,Vgx]]];
t[451]
是我的错?这个方法不合适吗?或者这是Wolfram Mathematica的局限性
谢谢特奥多罗·马里努奇
另外,对于所有感兴趣的人来说,这是一个与诺曼-科伦三极管模型有关的问题。正如我在评论中所说,我的猜测是,
逆函数
首先尝试以符号方式解逆,例如,解[Function[{Vpx,Vgx},f[Vpx,Vgx][X,#2]===#1,X]
,这需要很长时间(我没有让它完成). 但是,我遇到了一个系统选项,它似乎关闭了此功能并生成了一个函数:
With[{opts = SystemOptions["ExtendedInverseFunction"]},
Internal`WithLocalSettings[
SetSystemOptions["ExtendedInverseFunction" -> False],
t = InverseFunction[Function[{Vpx, Vgx}, f[Vpx, Vgx]], 1, 2],
SetSystemOptions[opts]
]];
t[451, -4]
(* 199.762 *)
几点注意:
InverseFunction
如果输入准确,则应生成准确的答案。这里的一些参数是近似(浮点)实数,所以上面的答案是数值近似t
的实际定义取决于f
。如果f
改变,那么副作用就是t
改变。如果这不是您明确想要的,那么最好这样定义t
:
t = InverseFunction[Function[{Vpx, Vgx}, Evaluate@f[Vpx, Vgx]], 1, 2]
正如我已故的理论物理学教授所说,“一个简单而美丽的解决方案很可能是正确的。”
下面是一段有效的代码:
mu = 20.82; ex = 1.25; kg1 = 1202.76; kp = 76.58; kvb = 126.92;
Ip[Vpx_, Vgx_] = Power[Vpx/kp Log[1 + Exp[kp (1/mu + Vgx/Sqrt[kvb + Vpx^2])]], ex] 2/kg1;
Vp[y_, z_] := x /. FindRoot[Ip[x, z] == y, {x, 80}]
管的“真实”放大系数是Ip[Vpx,Vgx]相对于Vgx的偏导数,给出Vpx。如果我能使用导数,我会更高兴,但我有错误。我将尝试理解原因,但目前定义是 [CapitalDelta]x=10^-6
[Micro][Ipx,Vgx]:=Abs[Vp[Ipx,Vgx+[CapitalDelta]x]-Vp[Ipx,Vgx]/[CapitalDelta]x
对我来说效果很好。
谢谢,这确实是FindRoot问题的起点。我的猜测是,它首先尝试以符号方式求解逆问题,例如,
求解[Function[{Vpx,Vgx},f[Vpx,Vgx]][X,#2]===#1,X]
,这需要很长时间(我也没有让它完成)。如果可以接受数值近似,您可能只想直接使用FindRoot
对逆运算进行编码;效果更好。现在我需要更多的帮助来理解如何修改inv[]函数,使einv是两个变量的函数:Vpx和Vgx。再次感谢各位工作顺利。我有些小毛病明天要解决。我去睡觉(对我来说现在是凌晨3点)。谢谢你,小故障比预期的严重。在很多地区,逆函数都不起作用。我画了一个等高线图,它似乎被抹掉了(到处都是白色)Thanks@TeodoroMarinucci(1)数值反向函数
使用具有任意起点的FindRoot
(或等效函数)。这就是为什么我建议手动使用FindRoot
,但您希望有一个很好的启发式方法来选择起点。(2) ContourPlot
中的白色通常表示函数值超过自动选择的PlotRange
。如果您还没有尝试过,请使用PlotRange->All
尝试ContourPlot
,尽管“到处都是白色”并没有给我太多希望。是的,没有希望。使用inv[f,s]:=函数[{t},s/.FindRoot[f-t,{s,10}],我可以合理地控制算法。然而,我不知道如何选择一个起点时,使用反演函数。或者,我想知道如何处理inv[f,s]中的两个变量。谢谢
mu = 20.82; ex = 1.25; kg1 = 1202.76; kp = 76.58; kvb = 126.92;
Ip[Vpx_, Vgx_] = Power[Vpx/kp Log[1 + Exp[kp (1/mu + Vgx/Sqrt[kvb + Vpx^2])]], ex] 2/kg1;
Vp[y_, z_] := x /. FindRoot[Ip[x, z] == y, {x, 80}]