2017-05-05 49 views
1

我有一个MATLAB脚本,它使用拉普拉斯变换解决了非均匀的一阶线性IVP。 (在这个例子中,脚本设置为解决IVP enter image description hereenter image description here在八度中,是否有办法为一个变量求解两个变量中的方程

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)) 

如果我取代“因素”为“收集”,剧本上八度几乎作品与象征打包链接到SymPy,除了“解决”命令https://www.mathworks.com/help/symbolic/solve.html

是否有任何八度(或SymPy,如果这将起到解决方法的作用)命令将作为一个MATLAB符号工具箱“解决”命令,所以我可以通过带有脚本的拉普拉斯变换来解决IVP,不得不手动解决X,然后使用“ilaplace”?

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

+0

“几乎”作品是什么意思?顺便说一句,'收集'[看起来](https://uk.mathworks。com/help/symbolic/collect.html)来收集系数;我在符号包中发现了一个'coeffs'函数,它似乎是等价的(尽管如此,似乎在这种情况下“factor”似乎有效)。 –

+0

根据我运行此代码时得到的错误('Python异常:AttributeError:MutableDenseMatrix没有属性is_Relational'),这可能是相关的:http://stackoverflow.com/questions/42802588/solving-two-non- linear-equations-in-octave –

+0

非常感谢您的回复! coeffs功能的确出现在我感兴趣的地方!一个简单的矩阵乘[1; X]再现MATLAB的收集。我有一些复制了上述MATLAB脚本的脚本(大约至少),但我会在下面的“答案”中发布这些脚本。非常感谢回复! –

回答

0

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

你只需要定义coeff*[1;X]结果作为设置为0的公式,说IVPEQ = coeff*[1;X] == 0,然后使用符号包命令solve在这个公式中,X = 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,为您提供巨大的帮助!

1

以下是一些Octave脚本(至少大概)重现上述MATLAB脚本。您必须按照X脚本手动输入IVP = 0的解决方案到每个脚本的第2部分,但它们确实起作用。如果任何人有无法像MATLAB解决函数那样根据X解决Octave求解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 \点{X} - 3×= 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)) 

非常感谢所有帮助和建议!这是真正的赞赏!

相关问题