Сообщение об ошибке: «Количество заменяемых элементов не кратно длине замены», ошибка с равной длиной вектора - PullRequest
0 голосов
/ 29 апреля 2019

Я работаю над решением ODE, и мне нужно вычислить ошибку числового решения, вычитая ее из точного решения $ x (t) = e ^ {0.2t} x (0) $.

Я уже рассчитал решение для одного временного шага, но я не могу обойти ошибку "количество заменяемых элементов не кратно длине замены" в моем коде для вычисления ошибки.Я включил свой код как для решения ODE, так и для вычисления ошибки.

#Calculating numeric solution ($$ \frac{dx}{dt} =  0.2 x $$)
fefunction<-function(x){
  ans<-0.2*x
  return(ans)
}
Tmax<-1 #length of time
dt<-0.1 #time step
numsteps<-Tmax/dt #number of steps
y<-rep(0,numsteps+1) #pre-allocating y
time<-seq(0,Tmax,dt) #setting up time vector
y[1]<-5 #initial value for the numeric solution
for(i in 1:numsteps){
  #forward Euler
  y[i+1]<-y[i]+dt*fefunction(y[i])
}
print(y[2]) #Numeric solution: 5.1

#calculating exact solution: $x(t) = e^{0.2t}x(0)$
exact<-function(t,x){ 
  ans<-exp(0.2*t)*x
  return(ans)
}
Tmax<-1 #length of time
dt<-0.1 #time step
t<-seq(0,Tmax,dt) #setting up time vector
numsteps<-Tmax/dt #number of steps
sol1<-rep(0,numsteps+1) #pre-allocating the solution
sol1[1]<-5 #initial value for the exact solution
for(i in 1:numsteps){
  #exact solution
  sol1[i+1]<-exact(t,sol1[i])
}
error<-sol1[1]-y[2]
print(error)

Ошибка должна составлять 0,0010067, поскольку точное решение - 5,1010067, а числовое - 5,1.Тем не менее, я получаю сообщение об ошибке «количество заменяемых элементов не кратно длине замены» для моего расчета ошибки, несмотря на наличие векторов одинаковой длины.

Как решить эту проблему?

Спасибо!

1 Ответ

0 голосов
/ 29 апреля 2019

Вы присваиваете вектор результатов одному значению в

sol1[i+1]<-exact(t,sol1[i])

, чтобы показать это, индивидуально для i = 1;

 i = 1
> sol1[i + 1]
[1] 0
> exact(t, sol1[i])
 [1] 5.000000 5.101007 5.204054 5.309183 5.416435 5.525855 5.637484 5.751369 5.867554 5.986087 6.107014

это потому что t = c(0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0)

, следовательно, назначение точного (t, sol1 [i]) для sol1 [i + 1] дает это предупреждение, потому что ваша замена имеет length 10, в то время как длина замены равна 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...