在 Octave 中,有没有一种方法可以求解 2 个变量中的 1 个变量的方程

In Octave, Is There a Way to Solve an Equation in 2 Variables for 1 of the Variables

我有一个 MATLAB 脚本,它使用拉普拉斯变换求解非齐次一阶线性 IVP。 (对于本例,脚本设置为求解IVP, 。)

syms x(t) s X;

a0 = -3;
x0 = 4;
rhs = t^2;

lhs = diff(x,t) + a0*x;
ode = lhs - rhs

Lx = X;
LDx = s*X - x0;
LHS = LDx + a0*Lx;
RHS = laplace(rhs,t,s);
IVP = LHS - RHS;

IVP = collect(IVP,X);

X = solve(IVP, X);
X = partfrac(X);

sol = ilaplace(X, s, t)
check1 = diff(sol,t) - 3*sol
check2 = vpa(subs(sol, t, 0))

如果我用 "factor" 替换 "collect",脚本 almost 在 Octave 上工作,符号包链接到 SymPy,除了 "solve"命令https://www.mathworks.com/help/symbolic/solve.html.

是否有任何 Octave(或 SymPy,如果它可以作为解决方法)命令将用作 MATLAB 符号工具箱 "solve" 命令,以便我可以使用脚本通过拉普拉斯变换求解 IVP 所以我不必手动求解 X,然后使用 "ilaplace"?

在此先感谢您提供的任何帮助。

这里有一些 Octave 脚本(大约,至少)重现了上述 MATLAB 脚本。您必须将 X 方面的 IVP = 0 的解决方案手动输入到每个脚本的第 2 部分,但它们确实起作用。如果有人像在 MATLAB 求解函数中一样让 Octave 根据 X 求解 IVP = 0,我会很高兴听到它。

这对求解 $\dot{x} - 3x = t^2$, $x(0) = 4$。

第 1 部分:

syms x(t) s X;

a0 = -3;
x0 = 4;
rhs = t^2;

lhs = diff(x,t) + a0*x;
ode = lhs - rhs

Lx = X;
LDx = s*X - x0;
LHS = LDx + a0*Lx;
RHS = laplace(rhs,t,s); % The t and s in laplace aren't necessary, as they are default
IVP = LHS - RHS;

coeff = coeffs(IVP,X);
IVP = coeff*[1;X]

第 2 部分:

syms x(t) s X;

X = -1*((-4*s^3-2)/s^3)/(s-3)

X = partfrac(X);

sol = ilaplace(X, s, t)
check1 = diff(sol,t) - 3*sol
check2 = vpa(subs(sol, t, 0))

这对求解 $\ddot{x} - 2\dot{x} - 3x = t^2$, $x(0) = 4$, $\dot{x}(0) = 5$.

第 1 部分:

syms x(t) s X;

a1 =-2;
a0 = -3;
x0 = 4;
xdot0 = 5;
rhs = t^2;

Dx = diff(x,t);
D2x = diff(x,t,2);
lhs = D2x + a1*Dx + a0*x;
ode = lhs - rhs

Lx = X ;
LDx = s*X - x0;
LD2x = s^2*X - x0*s - xdot0;
LHS = LD2x + a1*LDx + a0*Lx;
RHS = laplace(rhs,t,s); % The t and s in laplace aren't necessary, as they are default
IVP = LHS - RHS;

coeff = coeffs(IVP,X);
IVP = coeff*[1;X]

第 2 部分:

syms x(t) s X;

a1 = -2;
a0 = -3;

X = -1*((-4*s^4 + 3*s^3 - 2)/s^3)/(s^2 - 2*s - 3)

X = partfrac(X);

sol = ilaplace(X, s, t)

Dsol = diff(sol,t);
D2sol = diff(sol,t,2);
check1 = D2sol + a1*Dsol + a0*sol
check2 = vpa(subs(sol, t, 0))
check3 = vpa(subs(Dsol, t, 0))

非常感谢所有的帮助和建议!非常感谢!

好的,我的一个学生解决了这个问题(我将在本周晚些时候联系他,看看他是否希望公开承认他的解决方案)。

你只需要将coeff*[1;X]的结果定义为等于0的方程组,比如说IVPEQ = coeff*[1;X] == 0,然后在这个方程上使用符号包命令solveX = solve(IVPEQ, X).

这是我以前的一阶 IVP 求解器的版本,经过我的学生修改

syms x(t) s X;

a0 = -3;
x0 = 4;
rhs = t^2;

lhs = diff(x,t) + a0*x;
ode = lhs - rhs

Lx = X;
LDx = s*X - x0;
LHS = LDx + a0*Lx;
RHS = laplace(rhs,t,s); % The t and s in laplace aren't necessary, as they are default
IVP = LHS - RHS;

coeff = coeffs(IVP,X);
IVPEQ = coeff*[1;X] == 0;

X = solve(IVPEQ,X);

X = partfrac(X);

sol = ilaplace(X, s, t)

Dsol = diff(sol,t);
check1 = Dsol + a0*sol
check2 = vpa(subs(sol, t, 0))

这是经过学生修改的二阶 IVP 求解器

syms x(t) s X;

a1 =-2;
a0 = -3;
x0 = 4;
xdot0 = 5;
rhs = t^2;

Dx = diff(x,t);
D2x = diff(x,t,2);
lhs = D2x + a1*Dx + a0*x;
ode = lhs - rhs

Lx = X ;
LDx = s*X - x0;
LD2x = s^2*X - x0*s - xdot0;
LHS = LD2x + a1*LDx + a0*Lx;
RHS = laplace(rhs,t,s); % The t and s in laplace aren't necessary, as they are default
IVP = LHS - RHS;

coeff = coeffs(IVP,X);
IVPEQ = coeff*[1;X] == 0;

X = solve(IVPEQ,X);

X = partfrac(X);

sol = ilaplace(X, s, t)

Dsol = diff(sol,t);
D2sol = diff(sol,t,2);
check1 = D2sol + a1*Dsol + a0*sol
check2 = vpa(subs(sol, t, 0))
check3 = vpa(subs(Dsol, t, 0))

再次感谢@Tasos_Papastylianou,感谢您的大力帮助!