How to fix "Number of equations greater than number of indeterminates. Trying heuristics to reduce to square system." error.

17 次查看(过去 30 天)
I have a second order differential that needs solvingand am getting the error listed in the title. It is related to solving a mass-spring-damper system with a non-zero forcing term. Any advice on what is causing the problem and/or could fix it would be greatly appreciated.
clear
clc
close all
m = 10;
k = 160;
t = 0:0.1:50;
b = 0;
F = 200*sin(2*pi*t);
x_0 = -3;
x_dot_0 = 0;
syms x(t)
Dx = diff(x,1);
D2x = diff(x,2);
x = dsolve(F-D2x+(b/m)*Dx+(k/m)*x ==0, x(0) == x_0, Dx(0) == x_dot_0, 't');
Warning: Number of equations greater than number of indeterminates. Trying heuristics to reduce to square system.
Error using symengine
Unable to reduce to square system because the number of equations differs from the number of indeterminates.

Error in mupadengine/evalin_internal

Error in mupadengine/fevalHelper

Error in mupadengine/feval_internal

Error in dsolve>mupadDsolve (line 334)
T = feval_internal(symengine,'symobj::dsolve',sys,x,options);

Error in dsolve (line 203)
sol = mupadDsolve(args, options);
x_fun = matlabFunction(x);
x_dot_fun = matlabFunction (diff(x));
x_t = x_fun(time);
v_t = x_dot_fun(time);
plot(t, x_t);

采纳的回答

Star Strider
Star Strider 2024-2-8
编辑:Star Strider 2024-2-8
There are a few problems you will likely want to fix.
In the interim, try this —
syms x(t) t
m = 10;
k = 160;
% t = 0:0.1:50;
b = 0;
F = 200*sin(2*pi*t);
x_0 = -3;
x_dot_0 = 0;
Dx = diff(x,1);
D2x = diff(x,2);
x = dsolve(F-D2x+(b/m)*Dx+(k/m)*x ==0, x(0) == x_0, Dx(0) == x_dot_0, 't');
x_fun = matlabFunction(x);
x_dot_fun = matlabFunction (diff(x));
time = 0:0.1:50;
x_t = x_fun(time);
v_t = x_dot_fun(time);
figure
plot(time, x_t)
hold on
plot(time, v_t)
hold off
grid
% set(gca,'YScale','log')
.

更多回答(1 个)

John D'Errico
John D'Errico 2024-2-8
编辑:John D'Errico 2024-2-8
You need to understand what was wrong in your forumulation. You want to solve this system using symbolic tools.
% define some constants
m = 10;
k = 160;
b = 0;
% t = 0:0.1:50;
But, by defining t as a vector of discrete elements, that circumvents what you want to do. Your goal was to use dsolve. t and x should be SYMBOLIC variables, not a discrete vector. I think new users seem to often get confused between a vector of elements like you did with t, and then create F, as another vector. F was not a function as you created it, but just another discrete vector of elements.
This next line creates the symbolic variable t, and an unknown function x(t).
syms x(t)
And now we can create F, a forcing term which is a function of t.
F = 200*sin(2*pi*t);
x_0 = -3;
x_dot_0 = 0;
Dx = diff(x,1);
D2x = diff(x,2);
Now you can indeed perform the solve. There is no need to have the 't' at the end of the call to dsolve though.
x = dsolve(F-D2x+(b/m)*Dx+(k/m)*x ==0, x(0) == x_0, Dx(0) == x_dot_0)
x = 
x is now a function that satisfies the differential equation, as well as the indicated boundary conditions. You can now do anything with x that you wish, even substitute in a set of discrete values for t, if that is your wish.
Remember though, don't get mixed up in what you are doing. That was your fundamental problem here. The difference between a vector of elements and a function is a subtle one, but something important to understand.

标签

产品


版本

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by