给定常量
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]))]];哪里
s[x_] := 1 + kvb/(2 x^2);所以我得到了一个两个变量的函数,第二个是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的局限性?
谢谢
Teodoro Marinucci
附注:对于每个感兴趣的人来说,这是一个与诺曼科伦三重奏模型有关的问题。
发布于 2018-08-03 07:33:18
正如我在我的评论中所说的,我的猜测是InverseFunction首先试图象征性地解决相反的问题,例如Solve[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应该会产生准确的答案。这里的一些参数是近似(浮点)实数,所以上面的答案是一个数值approximation.t的实际定义取决于f。如果f改变了,那么一个副作用就是t改变了。如果这不是您明确想要的,那么用这种方式定义t可能更好:T=InverseFunction[函数[{Vpx,Vgx},Evaluate@fVpx,Vgx],1,2]
发布于 2018-08-05 01:15:22
正如我已故的理论物理学教授所说,“一个简单而美丽的解决方案很可能是真的”。
下面是一段有效的代码:
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}] 管的“实际”放大系数是IpVpx、Vgx对Vgx的偏导数,与给定的Vpx相乘。如果可以使用导数,我会更高兴,但我有错误。
我会试着理解其中的原因,但目前
[CapitalDelta]x = 10^-6; [Micro][Ipx\_, Vgx\_] := Abs[Vp[Ipx, Vgx + [CapitalDelta]x] - Vp[Ipx, Vgx]]/[CapitalDelta]x对我来说效果很好。
谢谢,这确实是FindRoot问题的起点。
https://stackoverflow.com/questions/51659989
复制相似问题