2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Mathematica - проблемы с NDSolve
Сообщение04.05.2012, 23:09 


04/05/12
5
Доброго времени суток! В неравном бою с Mathematica 8.0 не могу численно решить следующую систему из 2х ОДУ с параметром V (V~t как частный случай):
Код:
k1 = 6000;
k2 = 60000;
Ix = 0.2;
Iz = 0.05;
Ixz = 0.007;
Xc = 0.025;
Zc = 0.1;
ro = 0.7;
l = 0.3;

With[{a11 = k1, a22 = k2, c11 = Ix, c22 = Iz, c12 = -Ixz, c21 = -Ixz,
  V = 350 + t, M = V/330,
  k = (0.25 + 0.07*M*HeavisideTheta[3 - M] +
     0.21*HeavisideTheta[M - 3]), K1 = 2*ro/(sqrt (M^2 - 1)),
  d011 = (0.25 - 0.5*z)*z^2,
  d012 = ((0.15 - 0.5*z)/(0.25 - 0.5*z) + ((k*z)/2 - z/2 - k/4 +
         3/20)/(0.25 - 0.5*z))*(0.25 - 0.5*z)^2*z,
  d022 = (((0.15 - 0.5*z)/(0.25 - 0.5*z) + ((k*z)/2 - z/2 - k/4 +
            3/20)/(0.25 - 0.5*z))^2 + 1/12)*(0.25 - 0.5*z)^3,
  d11 = K1*NIntegrate[d011, {z, 0, l}],
  d12 = K1*NIntegrate[d012, {z, 0, l}], d21 = d12,
  d22 = K1*NIntegrate[d022, {z, 0, l}], b012 = (0.25 - 0.5*z)*z,
  b12 = -K1*NIntegrate[b012, {z, 0, l}],
  b022 = ((0.15 - 0.5*z)/(0.25 - 0.5*z) + ((k*z)/2 - z/2 - k/4 +
         3/20)/(0.25 - 0.5*z))*(0.25 - 0.5*z)^2,
  b22 = -K1*NIntegrate[b022, {z, 0, l}]}
, sol = NDSolve[{c11*q''[t] + d11*V*q'[t] + a11*q[t] + c12*r''[t] +
      d12*V*r'[t] + b11*V^2*q[t] + b12*V^2*r[t] == 10 sin (t),
    c21*q''[t] + d21*V*q'[t] + a22*r[t] + c22*r''[t] + d22*V*r'[t] +
      b21*V^2*q[t] + b22*V^2*r[t] == 10 sin (t), q[0] == 4,
    q'[0] == 6, r[0] == -17, r'[0] == -10}, {q, r}, {t, 0, 100}]]

Plot[Evaluate[{q[t], r[t]}], {t, 0, 100}]

Пожалуйста, укажите на ошибки или киньтесь годным работающим примером аналогичной задачи :-)

 Профиль  
                  
 
 Re: Mathematica - проблемы с NDSolve
Сообщение04.05.2012, 23:33 
Заслуженный участник


25/02/11
1787
Математика различает большие и маленькие буквы. И не будет численно решать, если в уравнениях есть переменные без численного значения.

 Профиль  
                  
 
 Re: Mathematica - проблемы с NDSolve
Сообщение04.05.2012, 23:44 


19/10/11
174
Насколько я понял, в параметр V входит переменная t, которая является независимой переменной в NDSolve. Нужно записать все коэффициенты в виде функций от t, или присваивать им значения лениво (через :=), сейчас проблема в том, что Математика пытается численно посчитать интегралы, в которые t входит просто как буковка, без привязанного к ней значения.

 Профиль  
                  
 
 Re: Mathematica - проблемы с NDSolve
Сообщение04.05.2012, 23:59 


04/05/12
5
Хорошо, заменим NIntegrate -> Integrate. Теперь ошибка в вычислении производной в начальной точке.
Код:
$NDSolve::ndnum: Encountered non-numerical value for a derivative at t == 0.`. >>$

upd1: ни перенос н.у. на другой момент времени, ни добавление параметра SolveDelayed -> True по следам хелпа результата не дало.

 Профиль  
                  
 
 Re: Mathematica - проблемы с NDSolve
Сообщение05.05.2012, 08:47 


19/10/11
174
Посмотрите в хелпе, как правильно записывать функции в Mathematica (например, вместо sqrt(x) написать Sqrt[x]), также нужно избавиться от всех коэффициентов в выражении, которое считает NDSolve, я, например, не могу понять, где определяется коэффициент b11?

 Профиль  
                  
 
 Re: Mathematica - проблемы с NDSolve
Сообщение05.05.2012, 09:35 


04/05/12
5
b11 остался случайно, забыл потереть в ходе упрощения задачи)

Код:
k1 = 6000;
k2 = 60000;
Ix = 0.2;
Iz = 0.05;
Ixz = 0.007;
Xc = 0.025;
Zc = 0.1;
ro = 0.7;
l = 0.3;

With[{a11 = k1, a22 = k2, c11 = Ix, c22 = Iz, c12 = -Ixz, c21 = -Ixz,
  V = 350 + t,
  M = V/330,
  k = (0.25 + 0.07*M*HeavisideTheta[3 - M] +
     0.21*HeavisideTheta[M - 3]),
  K1 = 2*ro/(Sqrt [M^2 - 1]),
  d011 = (0.25 - 0.5*z)*z^2,
  d012 = ((0.15 - 0.5*z)/(0.25 - 0.5*z) + ((k*z)/2 - z/2 - k/4 +
         3/20)/(0.25 - 0.5*z))*(0.25 - 0.5*z)^2*z,
  d022 = (((0.15 - 0.5*z)/(0.25 - 0.5*z) + ((k*z)/2 - z/2 - k/4 +
            3/20)/(0.25 - 0.5*z))^2 + 1/12)*(0.25 - 0.5*z)^3,
  b022 = ((0.15 - 0.5*z)/(0.25 - 0.5*z) + ((k*z)/2 - z/2 - k/4 +
         3/20)/(0.25 - 0.5*z))*(0.25 - 0.5*z)^2,
  b012 = (0.25 - 0.5*z)*z,
  d11 = K1*Integrate[d011, {z, 0, l}],
  d12 = K1*Integrate[d012, {z, 0, l}],
  d21 = d12,
  d22 = K1*Integrate[d022, {z, 0, l}],
  b12 = -K1*Integrate[b012, {z, 0, l}],
  b22 = -K1*Integrate[b022, {z, 0, l}]
  }, sol =
  NDSolve[{c11*q''[t] + d11*V*q'[t] + a11*q[t] + c12*r''[t] +
      d12*V*r'[t] + b12*V^2*r[t] == 10 sin (t),
    c21*q''[t] + d21*V*q'[t] + a22*r[t] + c22*r''[t] + d22*V*r'[t] +
      b22*V^2*r[t] == 10 sin (t), q[1] == 1, q'[1] == 2, r[1] == 3,
    r'[1] == 4}, {q, r}, {t, 1, 100}, SolveDelayed -> True]]

Plot[Evaluate[{q[t], r[t]}], {t, 1, 100}]


Код:
NDSolve::nlnum: The function value {0.,6000. -110881. b012 K1+210.6 d011 K1+421.2 d012 K1-10. sin,0.,180000. +702. d12-110881. b022 K1+421.2 d022 K1-10. sin}
is not a list of numbers with dimensions {4} at {t,q[t],(q^\[Prime])[t],r[t],(r^\[Prime])[t],(q^\[Prime])[t],(q^\[Prime]\[Prime])[t],(r^\[Prime])[t],(r^\[Prime]\[Prime])[t]} = {1.,1.,2.,3.,4.,2.,0.,4.,0.}. >>

Можно ли задать коэффициенты, вычисляющиеся интегралами и зависящие от V(t), неким другим способом?

 Профиль  
                  
 
 Re: Mathematica - проблемы с NDSolve
Сообщение05.05.2012, 11:06 


19/10/11
174
Во-первых, синус так и не исправлен, во-вторых, проблема может быть в том, что блоке определения переменных одни переменные определяются через другие (например, сначала определяется M, а потом в дальнейшие коэффициенты входит M, это может не работать), в-третьих, можно попробовать заменить равенства (=) на ленивое присваивание (:=), или явно определить коэффициенты как функции от t (например, d11[x_]:=K1*Integrate[d011, {z, 0, l}]/. t->x)

 Профиль  
                  
 
 Re: Mathematica - проблемы с NDSolve
Сообщение05.05.2012, 15:26 


04/05/12
5
Упростил донельзя - теперь подинтегральные выражения вообще не зависят от t, но все равно не выходит :/
Код:
k1 = 6000,
k2 = 60000,
Ix = 0.2,
Iz = 0.05,
Ixz = 0.007,
Xc = 0.025,
Zc = 0.1,
ro = 0.7,
l = 0.3,
k = 0.33,
With[{a11 = k1, a22 = k2, c11 = Ix, c22 = Iz, c12 = -Ixz, c21 = -Ixz,
  ro = 0.7,
  V := 16.5*t + 396,
  M := 1.2 + 0.05*t,
 
  K1 := 2*ro/(Sqrt [(1.2 + 0.05*t)^2 - 1]),
  d011 := (0.25 - 0.5*z)*z^2,
  d012 := ((0.15 - 0.5*z)/(0.25 - 0.5*z) + ((0.33*z)/2 - z/2 -
         0.33/4 + 3/20)/(0.25 - 0.5*z))*(0.25 - 0.5*z)^2*z,
  d022 := (((0.15 - 0.5*z)/(0.25 - 0.5*z) + ((0.33*z)/2 - z/2 -
            0.33/4 + 3/20)/(0.25 - 0.5*z))^2 + 1/12)*(0.25 - 0.5*z)^3,
  b022 := ((0.15 - 0.5*z)/(0.25 - 0.5*z) + ((0.33*z)/2 - z/2 -
         0.33/4 + 3/20)/(0.25 - 0.5*z))*(0.25 - 0.5*z)^2,
  b012 := (0.25 - 0.5*z)*z,
  d11 = NIntegrate[d011, {z, 0, l}],
  d12 = NIntegrate[d012, {z, 0, l}],
  d21 = NIntegrate[d012, {z, 0, l}],
  d22 = NIntegrate[d022, {z, 0, l}],
  b12 = NIntegrate[b012, {z, 0, l}],
  b22 = NIntegrate[b022, {z, 0, l}]
  }, sol =
  NDSolve[{c11*q''[t] + K1*d11*V*q'[t] + a11*q[t] + c12*r''[t] +
      K1*d12*V*r'[t] - K1*b12*V^2*r[t] == 10 Sin [t],
    c21*q''[t] + K1*d21*V*q'[t] + a22*r[t] + c22*r''[t] +
      K1*d22*V*r'[t] - K1*b22*V^2*r[t] == 10 Sin [t],
    q[1] == 1, q'[1] == 2, r[1] == 3, r'[1] == 4}, {q, r}, {t, 1,
    100}, SolveDelayed -> True]]

Plot[Evaluate[{q[t], r[t]}], {t, 1, 100}]

Код:
NDSolve::nlnum: The function value {0.,24000. +492804. b11+628325. b012 K1+631.8 d011 K1-1053. d012 K1-10. sin,0.,-1.02*10^6+492804. b21+2106. d12+628325. b022 K1-1053. d022 K1-10. sin}
is not a list of numbers with dimensions {4} at {t,q[t],(q^\[Prime])[t],r[t],(r^\[Prime])[t],(q^\[Prime])[t],(q^\[Prime]\[Prime])[t],(r^\[Prime])[t],(r^\[Prime]\[Prime])[t]} = {1.,4.,6.,-17.,-10.,6.,0.,-10.,0.}. >>

ЧЯДНТ?

 Профиль  
                  
 
 Re: Mathematica - проблемы с NDSolve
Сообщение05.05.2012, 16:00 


19/10/11
174
В определении К1 участвует ro. Попробуйте вообще убрать With.

 Профиль  
                  
 
 Re: Mathematica - проблемы с NDSolve
Сообщение05.05.2012, 17:41 


04/05/12
5
Код:
k1 = 6000,
k2 = 60000,
Ix = 0.2,
Iz = 0.05,
Ixz = 0.007,

k = 0.33,
a11 = k1,
a22 = k2,
c11 = Ix,
c22 = Iz,
c12 = -Ixz,
c21 = -Ixz,
V = 16.5*t + 396,

K1 := 2*0.7/(Sqrt [(1.2 + 0.05*t)^2 - 1]),

d11 = 0.001,
d12 = 0.07,
d21 = 0.43,
d22 = 12,
b12 = 4,
b22 = 3,
sol = NDSolve[{
   c11*q''[t] + K1*d11*V*q'[t] + a11*q[t] + c12*r''[t] +
     K1*d12*V*r'[t] - K1*b12*V^2*r[t] == 10 Sin [t],
   c21*q''[t] + K1*d21*V*q'[t] + a22*r[t] + c22*r''[t] +
     K1*d22*V*r'[t] - K1*b22*V^2*r[t] == 10 Sin [t],
   q[1] == 1, q'[1] == 2, r[1] == 3, r'[1] == 4}, {q, r}, {t, 1, 100},
   SolveDelayed -> True]

Plot[Evaluate[{q[t], r[t]}], {t, 1, 100}]


Код:
Syntax::tsntxi: "k1=6000,k2=60000,Ix=0.2,Iz=0.05,Ixz=0.007,k=0.33,a11=k1,a22=k2,c11=Ix,c22=Iz,c12=-Ixz,c21=-Ixz,V=16.5*t+396,K1:=2*0.7/(Sqrt[(1.2+0.05*t)^2-1]),d11:=0.001,d12:=0.07,d21:=0.43,d22:=12,b12:=4,b22:=3,sol=NDSolve[<<1>>]" is incomplete; more input is needed.


Чего не хватает?

 Профиль  
                  
 
 Re: Mathematica - проблемы с NDSolve
Сообщение05.05.2012, 20:18 
Заслуженный участник


25/02/11
1787
Хелп слабо почитать? :-) Там есть вводный курс, где сказано, к примеру, что в конце ставится точка с запятой, а не запятая. Ну и в сообщении NDSolve говорит, что ему передан не численный вектор. Вот всем переменным (буквам), которые там есть, надо присвоить численные значения.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group