-
Notifications
You must be signed in to change notification settings - Fork 3
Constrained pendulum problem #36
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 1 commit
9c47f78
6d54390
0caf7cc
afdfa7e
cd25494
f072d66
dfee988
13cf20d
0bc36d2
42d822f
9b2ee98
a114be8
c3463f3
1b997dd
3bd98e8
5fa4f92
90bc7af
c51c478
46a4436
d23d13d
8453493
7ec54c6
c5cce23
ff96669
fc51b18
3c01164
e04aa6c
5a2cef0
73a155a
026c815
0e45849
2d282cc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
classdef Canonical < otp.constrainedpendulum.ConstrainedPendulumProblem | ||
%CANONICAL The constrained pendulum problem | ||
% | ||
% See | ||
% Ascher, Uri. "On symmetric schemes and differential-algebraic equations." | ||
% SIAM journal on scientific and statistical computing 10.5 (1989): 937-949. | ||
|
||
methods | ||
function obj = Canonical | ||
tspan = [0; 10]; | ||
|
||
params = otp.constrainedpendulum.ConstrainedPendulumParameters; | ||
params.Mass = 1; | ||
params.Length = 1; | ||
params.Gravity = otp.utils.PhysicalConstants.EarthGravity; | ||
|
||
y0 = [sqrt(2)/2; sqrt(2)/2; 0; 0]; | ||
|
||
obj = obj@otp.constrainedpendulum.ConstrainedPendulumProblem(tspan, y0, params); | ||
|
||
end | ||
end | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
classdef ConstrainedPendulumParameters | ||
%CONSTRAINEDPENDULUMPARAMETERS | ||
properties | ||
%Gravity defines the magnitude of acceleration towards the ground | ||
Gravity %MATLAB ONLY: (1,1) {mustBeNonnegative} | ||
%Mass defines the mass of the pendulum | ||
Mass %MATLAB ONLY: (1,1) {mustBeNonnegative} | ||
|
||
%Length defines the length of the pendulum | ||
Length %MATLAB ONLY: (1,1) {mustBeNonnegative} | ||
end | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
classdef ConstrainedPendulumProblem < otp.Problem | ||
|
||
%CONSTRAINEDPENDULUM PROBLEM This is a Hessenberg Index-2 DAE problem posed in terms of three constraints | ||
% | ||
|
||
properties | ||
|
||
Constraints | ||
ConstraintsJacobian | ||
end | ||
|
||
methods | ||
function obj = ConstrainedPendulumProblem(timeSpan, y0, parameters) | ||
obj@otp.Problem('Constrained Pendulum', 4, timeSpan, y0, parameters); | ||
end | ||
end | ||
|
||
methods (Access = protected) | ||
function onSettingsChanged(obj) | ||
m = obj.Parameters.Mass; | ||
l = obj.Parameters.Length; | ||
g = obj.Parameters.Gravity; | ||
|
||
% get initial energy | ||
initialconstraints = otp.constrainedpendulum.constraints([], obj.Y0, g, m, l, 0); | ||
E0 = initialconstraints(3); | ||
|
||
obj.RHS = otp.RHS(@(t, y) otp.constrainedpendulum.f(t, y, g, m, l, E0)); | ||
|
||
|
||
obj.Constraints = @(t, y) otp.constrainedpendulum.constraints(t, y, g, m, l, E0); | ||
obj.ConstraintsJacobian = @(t, y) otp.constrainedpendulum.constraintsjacobian(t, y, g, m, l, E0); | ||
|
||
end | ||
end | ||
end | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
function c = constraints(~, state, g, m, l, E0) | ||
|
||
x = state(1, :); | ||
y = state(2, :); | ||
u = state(3, :); | ||
v = state(4, :); | ||
|
||
c1 = x.^2 + y.^2 - l^2; | ||
c2 = 2*(x.*u + y.*v); | ||
c3 = m*(g*(y + l) + 0.5*(u.^2 + v.^2)) - E0; | ||
|
||
c = [c1; c2; c3]; | ||
|
||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
function dc = constraintsjacobian(~, state, g, m, ~, ~) | ||
|
||
|
||
x = state(1); | ||
y = state(2); | ||
u = state(3); | ||
v = state(4); | ||
|
||
dc1dx = 2*x; | ||
dc1dy = 2*y; | ||
dc1du = 0; | ||
dc1dv = 0; | ||
|
||
dc2dx = 2*u; | ||
dc2dy = 2*v; | ||
dc2du = 2*x; | ||
dc2dv = 2*y; | ||
|
||
dc3dx = 0; | ||
dc3dy = m*g; | ||
dc3du = m*g*u; | ||
dc3dv = m*g*v; | ||
|
||
dc = [dc1dx, dc1dy, dc1du, dc1dv; ... | ||
dc2dx, dc2dy, dc2du, dc2dv; ... | ||
dc3dx, dc3dy, dc3du, dc3dv]; | ||
|
||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
function dstate = f(~, state, g, m, l, ~) | ||
|
||
x = state(1, :); | ||
y = state(2, :); | ||
u = state(3, :); | ||
v = state(4, :); | ||
|
||
lambda = (m/(l^2))*(u.^2 + v.^2) - (g/(l^2))*y; | ||
|
||
dx = u; | ||
dy = v; | ||
du = -(lambda/m).*x; | ||
dv = -(lambda/m)*y - g/m; | ||
|
||
dstate = [dx; dy; du; dv]; | ||
|
||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this the right source? I don't see anything on a pendulum.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hairer, E., Roche, M., Lubich, C. (1989). Description of differential-algebraic problems. In: The Numerical Solution of Differential-Algebraic Systems by Runge-Kutta Methods. Lecture Notes in Mathematics, vol 1409. Springer, Berlin, Heidelberg. https://doi.org/10.1007/BFb0093948
That is the pendulum problem source.
The Ascher book has a nice formulation as a Hessenberg indeex 2 DAE( linear algebraic variables) we use.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah the citation is wrong.