Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Wolfram Mathematica逆函数的性能_Performance_Wolfram Mathematica - Fatal编程技术网

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}]