千里马 CAS - 替换
Maxima CAS - substitution
我正在尝试通过 maxima
中的代入来简化微分方程。但是,替换似乎不起作用。
这是我的代码:
depends (\rho,[t, r, \theta, z]); depends (V, [t, r, \theta, z]);
f_contin : diff (\rho, t) + diff (\rho*r*V[r], r)*(1/r) = 0;
base : diff (V[b]*r*\rho, r) = 0;
V_sub : V[r] = V[b] + \epsilon*V[r];
subst (V_sub, f_contin);
subst (base, %o6);
上次替换无效。我在这里做错了什么?
为了清楚起见,我在此处添加了一个屏幕截图:
函数subst(a,b,c)用a代替c中的b。它使用 3 个参数,你的第一个 subst 有效,因为它被解释为 subst (V[b] + \epsilon*V[r],V[r], f_contin);
您的第二个替换可能被解释为 subst (0,diff (V[b]*r*\rho, r),%)
因此没有任何替换。你想用什么代替什么?
问题是 subst(a=b, c)
(或等效的 subst(b, a, c)
)只能在 a
是 c
的精确子表达式时进行替换。
ratsubst
(见)可以处理某些情况 a
不是精确的子表达式,但在这种情况下它似乎不起作用。
但我认为你可以通过从另一个方程中减去一个方程来得到你想要的结果。请注意 (a=b) - (c=d)
会产生 a - c = b - d
。另请注意,我已经采取了另一个步骤(在 %i7 中)来应用 diff
运算符。此外,我将 %o7 乘以 r 得到类似 base
.
的结果
(%i1) depends (\rho,[t, r, \theta, z]); depends (V, [t, r, \theta, z]);
(%o1) [rho(t, r, theta, z)]
(%o2) [V(t, r, theta, z)]
(%i3) f_contin : diff (\rho, t) + diff (\rho*r*V[r], r)*(1/r) = 0;
drho d
r V ---- + r (-- (V )) rho + V rho
drho r dr dr r r
(%o3) ---- + ------------------------------------ = 0
dt r
(%i4) base : diff (V[b]*r*\rho, r) = 0;
drho d
(%o4) V r ---- + (-- (V )) r rho + V rho = 0
b dr dr b b
(%i5) V_sub : V[r] = V[b] + \epsilon*V[r];
(%o5) V = epsilon V + V
r r b
(%i6) subst (V_sub, f_contin);
drho drho d
(%o6) ---- + (r (epsilon V + V ) ---- + r (-- (epsilon V + V )) rho
dt r b dr dr r b
+ (epsilon V + V ) rho)/r = 0
r b
(%i7) %o6, nouns;
drho drho d d
(%o7) ---- + (r (epsilon V + V ) ---- + r (epsilon (-- (V )) + -- (V )) rho
dt r b dr dr r dr b
+ (epsilon V + V ) rho)/r = 0
r b
(%i8) expand (r*%o7 - base);
drho drho d
(%o8) r ---- + epsilon r V ---- + epsilon r (-- (V )) rho + epsilon V rho = 0
dt r dr dr r r
我正在尝试通过 maxima
中的代入来简化微分方程。但是,替换似乎不起作用。
这是我的代码:
depends (\rho,[t, r, \theta, z]); depends (V, [t, r, \theta, z]);
f_contin : diff (\rho, t) + diff (\rho*r*V[r], r)*(1/r) = 0;
base : diff (V[b]*r*\rho, r) = 0;
V_sub : V[r] = V[b] + \epsilon*V[r];
subst (V_sub, f_contin);
subst (base, %o6);
上次替换无效。我在这里做错了什么?
为了清楚起见,我在此处添加了一个屏幕截图:
函数subst(a,b,c)用a代替c中的b。它使用 3 个参数,你的第一个 subst 有效,因为它被解释为 subst (V[b] + \epsilon*V[r],V[r], f_contin);
您的第二个替换可能被解释为 subst (0,diff (V[b]*r*\rho, r),%)
因此没有任何替换。你想用什么代替什么?
问题是 subst(a=b, c)
(或等效的 subst(b, a, c)
)只能在 a
是 c
的精确子表达式时进行替换。
ratsubst
(见)可以处理某些情况 a
不是精确的子表达式,但在这种情况下它似乎不起作用。
但我认为你可以通过从另一个方程中减去一个方程来得到你想要的结果。请注意 (a=b) - (c=d)
会产生 a - c = b - d
。另请注意,我已经采取了另一个步骤(在 %i7 中)来应用 diff
运算符。此外,我将 %o7 乘以 r 得到类似 base
.
(%i1) depends (\rho,[t, r, \theta, z]); depends (V, [t, r, \theta, z]);
(%o1) [rho(t, r, theta, z)]
(%o2) [V(t, r, theta, z)]
(%i3) f_contin : diff (\rho, t) + diff (\rho*r*V[r], r)*(1/r) = 0;
drho d
r V ---- + r (-- (V )) rho + V rho
drho r dr dr r r
(%o3) ---- + ------------------------------------ = 0
dt r
(%i4) base : diff (V[b]*r*\rho, r) = 0;
drho d
(%o4) V r ---- + (-- (V )) r rho + V rho = 0
b dr dr b b
(%i5) V_sub : V[r] = V[b] + \epsilon*V[r];
(%o5) V = epsilon V + V
r r b
(%i6) subst (V_sub, f_contin);
drho drho d
(%o6) ---- + (r (epsilon V + V ) ---- + r (-- (epsilon V + V )) rho
dt r b dr dr r b
+ (epsilon V + V ) rho)/r = 0
r b
(%i7) %o6, nouns;
drho drho d d
(%o7) ---- + (r (epsilon V + V ) ---- + r (epsilon (-- (V )) + -- (V )) rho
dt r b dr dr r dr b
+ (epsilon V + V ) rho)/r = 0
r b
(%i8) expand (r*%o7 - base);
drho drho d
(%o8) r ---- + epsilon r V ---- + epsilon r (-- (V )) rho + epsilon V rho = 0
dt r dr dr r r