Skip to main content
4 of 4
replaced http://mathematica.stackexchange.com/ with https://mathematica.stackexchange.com/

NDSolve returns unevaluated when system gets bigger

I have a bridge, which I want to discretize on $n$ stiff rods. To find a solution I wrote the following code in mathematica:

    n = 4;

variables = Table[ToExpression["φ" <> ToString[i]], {i, 1, n}];

xComponents = Table[Cos[variables[[i]][t]], {i, 1, n}];

yComponents = Table[-Sin[variables[[i]][t]], {i, 1, n}];

endsOfRods = Table[{xComponents[[i]], yComponents[[i]]}, {i, 1, n - 1}];

xTotal = Table[
   l (Sum[endsOfRods[[i, 1]], {i, 1, j - 1, 1}] + 1/2 endsOfRods[[j, 1]]), {j,
     2, n - 1, 1}];

yTotal = Table[
   l (Sum[If[i <= n/2, endsOfRods[[i, 2]], (-1)*endsOfRods[[i, 2]]], {i, 1, 
        j - 1, 1}] + 
      If[j > n/2, (-1)*1/2 endsOfRods[[j, 2]], 1/2 endsOfRods[[j, 2]]]), {j, 
    2, n - 1, 1}];

centreOfMass = Table[{xTotal[[i]], yTotal[[i]]}, {i, 1, Length[xTotal], 1}];

velocityCentreOfMass = 
  Table[D[centreOfMass[[i]], t].D[centreOfMass[[i]], t], {i, 1, 
    Length[xTotal], 1}];

kineticEnergy = 
  Sum[If[i == 1 || i == n, 1/2*(1/3 m l^2)*D[variables[[i]][t], t]^2, 
    1/2 m velocityCentreOfMass[[i - 1]] + 
     1/2*(1/12 m l^2)*D[variables[[i]][t], t]^2], {i, 1, n, 1}];

potentialEnergy = 
  Sum[If[i == 1 || i == n, -m g l 1/2 Sin[variables[[i]][t]] , 
     m g yTotal[[i - 1]]], {i, 1, n, 1}](*gravity*)+ 
   Sum[If[i < n/2, 1/2 k (variables[[i]][t] - variables[[i + 1]][t])^2, 
     If[i == n/2, 1/2 k (variables[[i]][t] + variables[[i + 1]][t])^2, 
      1/2 k (variables[[i + 1]][t] - variables[[i]][t])^2]], {i, 1, n - 1, 
     1}](*rotational springs*);

lagrange = kineticEnergy - potentialEnergy;

Nonconservative part

F = {0, d D[(-1)*(yTotal[[n/2 - 1]] - l/2 Sin[variables[[n/2]][t]]), t]};

r = {(xTotal[[n/2 - 1]] + l/2 Cos[variables[[n/2]][t]]), (yTotal[[n/2 - 1]] - 
     l/2 Sin[variables[[n/2]][t]])};

generalizedForces = Table[F.D[r, variables[[i]][t]], {i, 1, n/2, 1}];

Numerical solution

equations = 
  Table[If[i <= n/2, 
    D[D[lagrange, D[variables[[i]][t], t]], t] - 
      D[lagrange, variables[[i]][t]] - generalizedForces[[i]] == 0, 
    D[D[lagrange, D[variables[[i]][t], t]], t] - 
      D[lagrange, variables[[i]][t]] == 0], {i, 1, n - 1, 1}];

AppendTo[equations, (-1)*(yTotal[[n/2]] + l/2 Sin[variables[[n/2 + 1]][t]] + 
      l Sin[variables[[n]][t]]) == 0];

m = 250(*kg*);
l = 0.75(*m*);
d = 4000(*Ns/m*);
EE = 2.1*10^(11)(*Pa*);
II = 1.5*10^(-6)(*m^4*);
g = 9.81(*m/s^2*);
k = EE II/l;

AppendTo[equations, Table[variables[[i]][t] == 0 /. t -> 0, {i, 1, n, 1}]];
AppendTo[equations, 
  Table[D[variables[[i]][t], t] == 0 /. t -> 0, {i, 1, n, 1}]];

solution = 
  NDSolve[equations, Table[variables[[i]][t], {i, 1, n, 1}], {t, 0, 5}];

Now the problem with this code is, that it works perfectly in case of disretization to $n=4$ parts. But changing $n$ to something bigger ($n=10$ for example) ends rather quickly where NDSolve[] only returns the same equations that were given as input.

Are there any other methods or how should one solve a system like this?

PS: This is an upgrade to THIS PROBLEM.

skrat
  • 1.3k
  • 2
  • 10
  • 20