-
Notifications
You must be signed in to change notification settings - Fork 3
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
Constrained pendulum problem #36
base: master
Are you sure you want to change the base?
Changes from 3 commits
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 = [email protected](tspan, y0, params); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Will the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That is an interesting question. In theory we should be able to add our own small method to OTP to handle these cases There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good point. Here's one idea: Add a |
||
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} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sharper validation: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good idea |
||
%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,35 @@ | ||
classdef ConstrainedPendulumProblem < otp.Problem | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps just There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This class ought to override There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Agree with both |
||
%CONSTRAINEDPENDULUM PROBLEM This is a Hessenberg Index-2 DAE problem posed in terms of three constraints | ||
% | ||
|
||
properties | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These should have |
||
Constraints | ||
ConstraintsJacobian | ||
Z0 = [0; 0; 0]; | ||
end | ||
|
||
methods | ||
function obj = ConstrainedPendulumProblem(timeSpan, y0, parameters) | ||
[email protected]('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)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This RHS will lead to confusion as a call to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also it looks like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I agree with this |
||
|
||
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, ~, ~) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What Jacobian is this exactly? For the DAE There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. in this formulation. y' = fhat(y) - ((g_y)^T)*z. T is transpose. so g_y * f_z = g_y*((g_y)^T) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this jacobian is actually just g_y There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this to be the standard for otp when getting the Jacobian for Half-Explicit methods? Or is this an internal functionality of the problem? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. if the problem is posed in terms of invariants, this should be standard. I might rename it to invariantJacobian |
||
|
||
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*u; | ||
dc3dv = m*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,19 @@ | ||
function dstate = f(~, state, g, m, l, ~) | ||
|
||
x = state(1, :); | ||
y = state(2, :); | ||
u = state(3, :); | ||
v = state(4, :); | ||
|
||
lxy2 = x.^2 + y.^2; | ||
|
||
lambda = (m/lxy2)*(u.^2 + v.^2) - (g/lxy2)*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.
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.