【问题标题】:In Octave, Is There a Way to Solve an Equation in 2 Variables for 1 of the Variables在 Octave 中,有没有办法为 1 个变量求解 2 个变量的方程
【发布时间】:2017-05-15 08:48:29
【问题描述】:

我有一个 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”,脚本几乎在 Octave 上工作,符号包链接到 SymPy,除了“solve”命令https://www.mathworks.com/help/symbolic/solve.html

是否有任何 Octave(或 SymPy,如果它可以作为一种解决方法)命令可以用作 MATLAB 符号工具箱“求解”命令,这样我就可以使用带有脚本的拉普拉斯变换来求解 IVP,所以我不必须手动求解X,然后使用“ilaplace”?

提前感谢您提供的任何帮助。

【问题讨论】:

  • 你所说的“几乎”作品是什么意思?顺便说一句,collectseems 用于收集系数;我在符号包中发现了一个 coeffs 函数,它似乎是等效的(尽管,是的,factor 在这种情况下似乎可以工作)。
  • 基于我在运行此代码时遇到的错误 (Python exception: AttributeError: MutableDenseMatrix has no attribute is_Relational),这可能是相关的:stackoverflow.com/questions/42802588/…
  • 非常感谢您的回复! coeffs 函数确实似乎是我感兴趣的!一个简单的矩阵乘法 [1;X] 再现了 MATLAB 的集合。我有一些复制上述 MATLAB 脚本的半成品脚本(至少大约),但我会在下面的“答案”中发布这些脚本。再次感谢您的回复!

标签: matlab octave sympy differential-equations


【解决方案1】:

这里有一些 Octave 脚本(至少大约)重现了上述 MATLAB 脚本。您必须在每个脚本的第 2 部分中手动输入以 X 表示的 IVP = 0 的解决方案,但它们确实起作用。如果有人在 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))

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

【讨论】:

    【解决方案2】:

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

    您只需要将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 的大力帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2010-09-17
      • 2019-03-10
      相关资源
      最近更新 更多