Wolfram mathematica 在mathematica中求解方程时如何避免RATNZ

Wolfram mathematica 在mathematica中求解方程时如何避免RATNZ,wolfram-mathematica,numerical,solver,Wolfram Mathematica,Numerical,Solver,我需要解下面的不可约超越方程。我的工作如下: Data = Import["FILE NAME", "Table"]; (*get actual data from a file*) l = Range[31, 249]; (*generate G,t pairs for the equation*) t = Data[[l, 1]]*10^-3; (*time in ms, convert to s*) G = Data[[l, 2]]; k = (4*Pi*1.33/633*^-9)*Sin

我需要解下面的不可约超越方程。我的工作如下:

Data = Import["FILE NAME", "Table"]; (*get actual data from a file*)
l = Range[31, 249];
(*generate G,t pairs for the equation*)
t = Data[[l, 1]]*10^-3; (*time in ms, convert to s*)
G = Data[[l, 2]];
k = (4*Pi*1.33/633*^-9)*Sin[10 Degree/2];
sb = 0.25*^-3;(*beam size in m*)
\[Omega] = 2;(*speed of rotation in rad/s*)
s = \[Omega]/(2 Degree);
\[Sigma] = Table[0, {Length[l]}]; (*data holder, to be filled in for loop*)
For[j = 1, j <= Length[l], j++,
  y = sig /.NSolve[{G[[j]] == Exp[-((k*s*sb*t[[j]])^2)/(2*(k*sb*sig*t[[j]])^2 + 1)]*1/Sqrt[2*(k*sb*sig*t[[j]])^2 + 1]), sig >= 0}, sig, Reals][[1]];
  \[Sigma][[j]] = {t[[j]]*10^3, G[[j]], y};
  ];
\[Sigma]
这导致结果变得非常不精确。例如,有一次我无意中在指数的分子中加了一个2,这对输出结果没有影响。这意味着Ratnz程序非常接近解决方案,对实际输入几乎不敏感。从下面的示例数据中可以看出,数据在逐点的基础上没有太大差异,因此允许对因子2不敏感

Example Data (will be read in from text file during import):
t(ms)               G(t)
  1.00000E-003    8.09982E-001
  1.20000E-003    8.05885E-001
  1.40000E-003    8.02226E-001

我如何让mathematica来解决手头的系统,这不是一个很差的近似值?

因为数值精度问题非常依赖于实际使用的数字,并且您没有从数据文件中显示真正突出问题的两三行示例,因此几乎不可能提出解决方案,也完全不可能实际验证解决方案是否有效处理数据文件

从您的数据文件中挑选出两到三行能够很好地说明问题的内容,并将其添加到附加注释中,然后我将花几分钟的时间,看看是否能找到一种方法来最小化问题,甚至修复问题

您的代码中似乎还有一个可能是scrape-n-paste错误。在NSolve中列表中的第一项末尾可能会有一个额外的选项),要么就是这个选项,要么就是暗示了一个更大的问题


Mathematica与FORTRAN不同,它跟踪所使用的每个值的精度,然后通过所有计算传播该精度。因此,如果你引入一个精度为一位数的数字,然后用它和十几个不同的其他值进行计算,其中一些精度更高,那么你很容易得到一个精度不到一位数的结果。由于您使用的常数只有两位数的精度,并且您的计算可能需要更多才能获得好的结果,这可能是您的问题的一部分,但如果没有数据,我们无法判断。

手动消除所有小数点,以绕过Mathematica的自动机器精度近似过程

In[1]:= Data={{10/10^4,809982/10^6},{12/10^4,805885/10^6},{14/10^4,802226/10^6}};
l = Range[1, 3];t = Data[[l, 1]]*10^-3;G = Data[[l, 2]];
k = 4*Pi*133/100/(633*10^-9)*Sin[10 Degree/2];
sb = 25/100*10^-3;\[Omega] = 2;s = \[Omega]/(2 Degree);
\[Sigma] = Table[0, {Length[l]}];
For[j = 1, j <= Length[l], j++, 
  y=sig/.NSolve[{G[[j]]==Exp[-((k*s*sb*t[[j]])^2)/(2*(k*sb*sig*t[[j]])^2+1)]*1/
  Sqrt[2*(k*sb*sig*t[[j]])^2+1], sig>=0}, sig, Reals, WorkingPrecision->50][[1]];
  \[Sigma][[j]] = {t[[j]]*10^3 + 0., G[[j]] + 0., y};
];\[Sigma]

Out[7]= {
{0.001, 0.809982, 888.07100020205412013305651535199097225624483722309},
{0.0012, 0.805885, 750.32195491553116360487109372989348411883522775346},
{0.0014, 0.802226, 650.84411888264632019635531363713286343974593136657}}

数据点非常有用。非常感谢。您能否以您希望的任何方式提供其中一点的理想解决方案?这样我就可以将更改的结果与您的目标进行比较。如果我将SetPrecision[Import[…],30]换行以强制输入具有30位精度,则结果不会更改。如果我将Pi*1.33更改为Pi*4/3,将0.25*^-3更改为1/4/1000,结果会发生很大变化,但我不知道这些更改是否完全正确。您还可以将添加WorkingPrecision->30作为您的解决方案的一个选项。查看NSolve的帮助页面,单击“详细信息和选项”,阅读相关信息,然后在“示例”下单击“选项”,然后单击“工作精度”并查看。将任何近似的十进制值更改为精确的有理数如果这是实际值,请再次运行代码,看看结果是否更接近您知道应该得到的答案。我不知道提前得到的答案是什么。我正在努力为他们解决问题。这是一个没有任何数据提前知道答案的情况。不可行。此输入来自仪器,因此文本文件中数据的格式不受我的控制。手动编辑它以允许这样做是不实际的。另外,您的时间单位不相等。很抱歉时间单位错误,我的格式错误。更正。了解如何使用字符串替换删除小数点并缩放以提供精确结果。我将在几分钟内摆弄它。string=“1.00000E-003 8.09982E-001”;FullForm[StringReplace[string,{“E-003”->“*10^-6”,“E-001”->“*10^-6”,““->”,“->”,““->”,“}]”]可以将您的字符串从十进制转换为精确格式,然后将字符串转换为数字。您可以使用SetPrecision,将“二进制零”附加到浮点值,也可以使用StringJoin附加“十进制零”转换为字符串形式,然后转换为浮点,以获得更高的精度,从而得到更精确的解。谷歌为Mathematics提供了一个导入科学表格,以查看其他stackoverflow问题如何处理这一问题的示例。
In[1]:= Data={{10/10^4,809982/10^6},{12/10^4,805885/10^6},{14/10^4,802226/10^6}};
l = Range[1, 3];t = Data[[l, 1]]*10^-3;G = Data[[l, 2]];
k = 4*Pi*133/100/(633*10^-9)*Sin[10 Degree/2];
sb = 25/100*10^-3;\[Omega] = 2;s = \[Omega]/(2 Degree);
\[Sigma] = Table[0, {Length[l]}];
For[j = 1, j <= Length[l], j++, 
  y=sig/.NSolve[{G[[j]]==Exp[-((k*s*sb*t[[j]])^2)/(2*(k*sb*sig*t[[j]])^2+1)]*1/
  Sqrt[2*(k*sb*sig*t[[j]])^2+1], sig>=0}, sig, Reals, WorkingPrecision->50][[1]];
  \[Sigma][[j]] = {t[[j]]*10^3 + 0., G[[j]] + 0., y};
];\[Sigma]

Out[7]= {
{0.001, 0.809982, 888.07100020205412013305651535199097225624483722309},
{0.0012, 0.805885, 750.32195491553116360487109372989348411883522775346},
{0.0014, 0.802226, 650.84411888264632019635531363713286343974593136657}}
Out[]= {
{0.001, 0.809982, 888.071},
{0.0012, 0.805885, 750.322},
{0.0014, 0.802226, 650.844}}