即使使用 vpa 或 sym,如何在不获取 inf 的情况下计算 matlab 中的指数?
How to compute an exponent in matlab without getting inf even with vpa or sym?
我在 matlab 中有这个 exp 函数
a1=(exp(-beta0*abs(z-zaks)));
b1=(ohmi*exp(-2*beta0*H)*exp(-beta0*(z+zaks)))
c1=(ohmu*exp(beta0*(z+zaks)))
f1=(ohmu*ohmi*exp(-2*beta0*H)*exp(beta0*abs(z-zaks)))
g1=2*beta0*(1-(ohmu*ohmi*exp(-2*beta0*H)))
h1=(a1+b1+exp(c1)+f1)
j1=exp(h1)
gpm=j1/g1
和
beta0=1.411608078945960e+20 + 8.949434210398852e-26i
betai=[1.411608078945960e+20 + 8.949434210398852e-26i 1.411608078945960e+20 + 1.398349095374821e-26i 1.411608078945960e+20 + 1.398349095374821e-27i 1.411608078945960e+20 + 1.398349095374821e-26i]
ohmi=[9.803212783111246e-92 + 2.674639380309578e-46i 2.428723887707741e-93 + 4.457732300515962e-47i -2.428723887707741e-93 - 4.457732300515962e-47i;1.411608078945960e+20 + 1.398349095374821e-26i]
ohmu=1.004853842833425e-91 + 3.169942969255795e-46i
z=zaks=4950
H=5000
而且 return 是 inf
即使我在其中使用了 vpa 或 sym
这应该有什么问题?
还要看你是否正确使用了vpa
:
>> vpa(1e400)
ans =
Inf
>> vpa('1e400')
ans =
1.0e400
因此,在使用 vpa
之前,您始终必须防止 matlab 计算某些东西 large/small。现在,这并不能解决您的问题,因为
>> vpa(exp(1.3975e+024 +8.8599e-022*i))
ans =
Inf + Inf*i
>> vpa('exp(1.3975e+024 +8.8599e-022*i)')
ans =
Inf + Inf*i
>> exp(vpa('1.3975e+024 +8.8599e-022*i'))
ans =
RD_INF + RD_INF*i
因此,无论您使用何种方法,您都将获得无限的意图和目的。
为什么会这样,你可能会问?考虑一下
exp(710)
ans =
Inf
现在,你的人数大致等于
exp(1397500000000000000000000)
或
10^606926538459794441764864
或
1e606926538459794441764864
当然我忽略了一个极小的虚部,但这并没有太大变化。你确实意识到这是一个很大的数字,对吧?
所以,正如 已经评论过的:你打算用这个号码做什么?你最好的选择可能是先在纸上做任何你想做的事情,然后得到一个可以由计算机处理的结果。
我在 matlab 中有这个 exp 函数
a1=(exp(-beta0*abs(z-zaks)));
b1=(ohmi*exp(-2*beta0*H)*exp(-beta0*(z+zaks)))
c1=(ohmu*exp(beta0*(z+zaks)))
f1=(ohmu*ohmi*exp(-2*beta0*H)*exp(beta0*abs(z-zaks)))
g1=2*beta0*(1-(ohmu*ohmi*exp(-2*beta0*H)))
h1=(a1+b1+exp(c1)+f1)
j1=exp(h1)
gpm=j1/g1
和
beta0=1.411608078945960e+20 + 8.949434210398852e-26i
betai=[1.411608078945960e+20 + 8.949434210398852e-26i 1.411608078945960e+20 + 1.398349095374821e-26i 1.411608078945960e+20 + 1.398349095374821e-27i 1.411608078945960e+20 + 1.398349095374821e-26i]
ohmi=[9.803212783111246e-92 + 2.674639380309578e-46i 2.428723887707741e-93 + 4.457732300515962e-47i -2.428723887707741e-93 - 4.457732300515962e-47i;1.411608078945960e+20 + 1.398349095374821e-26i]
ohmu=1.004853842833425e-91 + 3.169942969255795e-46i
z=zaks=4950
H=5000
而且 return 是 inf 即使我在其中使用了 vpa 或 sym 这应该有什么问题?
还要看你是否正确使用了vpa
:
>> vpa(1e400)
ans =
Inf
>> vpa('1e400')
ans =
1.0e400
因此,在使用 vpa
之前,您始终必须防止 matlab 计算某些东西 large/small。现在,这并不能解决您的问题,因为
>> vpa(exp(1.3975e+024 +8.8599e-022*i))
ans =
Inf + Inf*i
>> vpa('exp(1.3975e+024 +8.8599e-022*i)')
ans =
Inf + Inf*i
>> exp(vpa('1.3975e+024 +8.8599e-022*i'))
ans =
RD_INF + RD_INF*i
因此,无论您使用何种方法,您都将获得无限的意图和目的。
为什么会这样,你可能会问?考虑一下
exp(710)
ans =
Inf
现在,你的人数大致等于
exp(1397500000000000000000000)
或
10^606926538459794441764864
或
1e606926538459794441764864
当然我忽略了一个极小的虚部,但这并没有太大变化。你确实意识到这是一个很大的数字,对吧?
所以,正如