使用条件查找虚部和实部
Using conditions to find imaginary and real part
我在 Mathematica 中使用 Solve 求方程的解(我在这里发帖的原因是没有人能在 Mathematica 堆栈中回答我的问题。)解称为 s,它是两个函数称为 v 和 ro 的变量。我想找到 s 的虚部和实部,我想使用 v 和 ro 是实部的信息,它们在以下区间内:
$ 0.02 < ro < 1 ,
40
我使用的代码如下:
ClearAll["Global`*"]
d = 1; l = 100; k = 0.001; kk = 0.001;ke = 0.0014;dd = 0.5 ; dr = 0.06; dc = 1000; p = Sqrt[8 (ro l /2 - 1)]/l^2;
m = (4 dr + ke^2 (d + dd)/2) (-k^2 + kk^2) (1 - l ro/2) (d - dd)/4 -
I v p k l (4 dr + ke^2 (d + dd)/2)/4 - v^2 ke^2/4 + I v k dr l p/4;
xr = 0.06/n;
tr = d/n;
dp = (x (v I kk/2 (4 dr + ke^2 (d + dd)/2) - I v kk ke^2 (d - dd)/8 - dr l p k kk (d - dd)/4) + y ((xr I kk (ro - 1/l) (4 dr + ke^2 (d + dd)/2)) - I v kk tr ke^2 (1/l - ro/2) + I dr xr 4 kk (1/l - ro/2)))/m;
a = -I v k dp/4 - I xr y kk p/2 + l ke^2 dp p (d + dd)/8 + (-d + dd)/4 k kk x + dr l p dp;
aa = -v I kk dp/4 + xr I y k p/2 - tr y ke^2 (1/l - ro/2) - (d - dd) x kk^2/4 + ke^2 x (d - dd)/8;
ca = CoefficientArrays[{x (s + ke^2 (d + dd)/2) +
dp (v I kk - l (d - dd) k p kk/2) + y (tr ro ke^2) - (d -
dd) ((-kk^2 + k^2) aa - 2 k kk a)/(4 dr + ke^2 (d + dd)/2) == 0, y (s + dc ke^2) + n x == 0}, {x, y}];
mat = Normal[ca];
matt = Last@mat;
sha = Solve[Det[matt] == 0, s];
shaa = Assuming[v < 100 && v > 40 && ro < 1 && ro > 0.03,Simplify[%]];
reals = Re[shaa];
ims = Im[shaa];
Solve[reals == 0, ro]
但它没有给出答案。有人能帮忙吗?我真的很感激这个问题的任何解决方案。
我运行你的代码到此为止
mat = Normal[ca]
看看结果。
有很多非常小的浮点系数,小到我怀疑它们中的大部分现在只是浮点噪声。 Mathematica 认为 0.1 只知道 1 个有效数字的精度,而你的 mat 结果现在可能只不过是零个正确数字。
我继续往下说到这里
sha = Solve[Det[matt] == 0, s]
如果您查看 sha 的值,您会发现它是 s->stuff,我认为这根本不是您所想的那样。来自 Solve 的 Mathematica returns "rules",不仅仅是表达式。
如果我将该行更改为
sha = s/.Solve[Det[matt] == 0, s]
那么我猜这更接近你想象中的你想要的。
我继续
shaa = Assuming[40<v<100 && .03<ro<1, Simplify[sha]];
reals = Re[shaa]
我改为使用,因为您假设 v 和 ro 是实数,并且因为 ComplexExpand 通常非常有助于让 Re 提供所需的结果,
reals=Re[ComplexExpand[shaa]]
然后我单击“全部显示”以查看它的完整扩展值。也就是约32块大屏幕全是你的表情
其中有数百个
Arg[-1. + 50. ro]
如果我理解你的意图,我相信所有这些都简化为 0。如果那是正确的,那么
reals=reals/.Arg[-1. + 50. ro]->0
将实数的大小减小到大约 20 个大屏幕。
但是仍然有数百个 Sqrt[(-1.+50.ro)^2] 和 ((-1.+50.ro)^2)^(1/4) 的例子组成了你的实数。不幸的是,我预计您的巨大表达式太大,并且需要很长时间才能使 Simplify with assumption 能够实际有效。
也许可以通过额外的替换来诱使它显着简化你的实数,而不会在实数和复数之间犯任何错误,但是你必须非常小心这些事情,因为用户在处理复数时犯错误是很常见的和根、幂和函数并最终得到不正确的结果,可能会使您的问题下降到对
可行的程度
Solve[reals == 0, ro]
给你一个有意义的答案。
这应该会让您了解需要仔细考虑和处理的内容。
我在 Mathematica 中使用 Solve 求方程的解(我在这里发帖的原因是没有人能在 Mathematica 堆栈中回答我的问题。)解称为 s,它是两个函数称为 v 和 ro 的变量。我想找到 s 的虚部和实部,我想使用 v 和 ro 是实部的信息,它们在以下区间内:
$ 0.02 < ro < 1 , 40
我使用的代码如下:
ClearAll["Global`*"]
d = 1; l = 100; k = 0.001; kk = 0.001;ke = 0.0014;dd = 0.5 ; dr = 0.06; dc = 1000; p = Sqrt[8 (ro l /2 - 1)]/l^2;
m = (4 dr + ke^2 (d + dd)/2) (-k^2 + kk^2) (1 - l ro/2) (d - dd)/4 -
I v p k l (4 dr + ke^2 (d + dd)/2)/4 - v^2 ke^2/4 + I v k dr l p/4;
xr = 0.06/n;
tr = d/n;
dp = (x (v I kk/2 (4 dr + ke^2 (d + dd)/2) - I v kk ke^2 (d - dd)/8 - dr l p k kk (d - dd)/4) + y ((xr I kk (ro - 1/l) (4 dr + ke^2 (d + dd)/2)) - I v kk tr ke^2 (1/l - ro/2) + I dr xr 4 kk (1/l - ro/2)))/m;
a = -I v k dp/4 - I xr y kk p/2 + l ke^2 dp p (d + dd)/8 + (-d + dd)/4 k kk x + dr l p dp;
aa = -v I kk dp/4 + xr I y k p/2 - tr y ke^2 (1/l - ro/2) - (d - dd) x kk^2/4 + ke^2 x (d - dd)/8;
ca = CoefficientArrays[{x (s + ke^2 (d + dd)/2) +
dp (v I kk - l (d - dd) k p kk/2) + y (tr ro ke^2) - (d -
dd) ((-kk^2 + k^2) aa - 2 k kk a)/(4 dr + ke^2 (d + dd)/2) == 0, y (s + dc ke^2) + n x == 0}, {x, y}];
mat = Normal[ca];
matt = Last@mat;
sha = Solve[Det[matt] == 0, s];
shaa = Assuming[v < 100 && v > 40 && ro < 1 && ro > 0.03,Simplify[%]];
reals = Re[shaa];
ims = Im[shaa];
Solve[reals == 0, ro]
但它没有给出答案。有人能帮忙吗?我真的很感激这个问题的任何解决方案。
我运行你的代码到此为止
mat = Normal[ca]
看看结果。
有很多非常小的浮点系数,小到我怀疑它们中的大部分现在只是浮点噪声。 Mathematica 认为 0.1 只知道 1 个有效数字的精度,而你的 mat 结果现在可能只不过是零个正确数字。
我继续往下说到这里
sha = Solve[Det[matt] == 0, s]
如果您查看 sha 的值,您会发现它是 s->stuff,我认为这根本不是您所想的那样。来自 Solve 的 Mathematica returns "rules",不仅仅是表达式。
如果我将该行更改为
sha = s/.Solve[Det[matt] == 0, s]
那么我猜这更接近你想象中的你想要的。
我继续
shaa = Assuming[40<v<100 && .03<ro<1, Simplify[sha]];
reals = Re[shaa]
我改为使用,因为您假设 v 和 ro 是实数,并且因为 ComplexExpand 通常非常有助于让 Re 提供所需的结果,
reals=Re[ComplexExpand[shaa]]
然后我单击“全部显示”以查看它的完整扩展值。也就是约32块大屏幕全是你的表情
其中有数百个
Arg[-1. + 50. ro]
如果我理解你的意图,我相信所有这些都简化为 0。如果那是正确的,那么
reals=reals/.Arg[-1. + 50. ro]->0
将实数的大小减小到大约 20 个大屏幕。
但是仍然有数百个 Sqrt[(-1.+50.ro)^2] 和 ((-1.+50.ro)^2)^(1/4) 的例子组成了你的实数。不幸的是,我预计您的巨大表达式太大,并且需要很长时间才能使 Simplify with assumption 能够实际有效。
也许可以通过额外的替换来诱使它显着简化你的实数,而不会在实数和复数之间犯任何错误,但是你必须非常小心这些事情,因为用户在处理复数时犯错误是很常见的和根、幂和函数并最终得到不正确的结果,可能会使您的问题下降到对
可行的程度Solve[reals == 0, ro]
给你一个有意义的答案。
这应该会让您了解需要仔细考虑和处理的内容。