绘制';n';R中具有给定间隔的给定函数之间的大小向量
让我把我的问题说清楚,因为我不知道如何恰当地提问(因此我不知道它是否已经得到了回答),我将讨论我的整个问题: 有一个给定的函数(如果重要的话,它是显式一阶微分方程的右侧): 然后有一个从'a'到'b'的给定间隔,这是函数计算的范围,其中有'n'步,因此间隔(dt)中的步长为: 在本例中,“a”始终为0,“b”始终为正,因此“b”始终大于“a”,但我尝试使用泛型 初始条件:绘制';n';R中具有给定间隔的给定函数之间的大小向量,r,R,让我把我的问题说清楚,因为我不知道如何恰当地提问(因此我不知道它是否已经得到了回答),我将讨论我的整个问题: 有一个给定的函数(如果重要的话,它是显式一阶微分方程的右侧): 然后有一个从'a'到'b'的给定间隔,这是函数计算的范围,其中有'n'步,因此间隔(dt)中的步长为: 在本例中,“a”始终为0,“b”始终为正,因此“b”始终大于“a”,但我尝试使用泛型 初始条件: yt0=y0 确定向量的计算: yt=vector("numeric",n) for (i in
yt0=y0
确定向量的计算:
yt=vector("numeric",n)
for (i in 1:(n-1))
{
yt[1]=f(0,yt0)*dt+yt0
yt[i+1]=(f(dt*i,yt[i]))*dt+yt[i]
}
创建的向量为“n”长,但这是从“a”到“b”区间之间微分方程的近似解。我的问题来了:
当我尝试将它与精确解一起绘制时(使用deSolve),它并不精确。向量的值是准确的,但它不知道这些值属于介于区间“a”到“b”之间的近似函数
这就是为什么精确解和近似解的图形根本不匹配的原因。我觉得筋疲力尽,所以我可能无法恰当地描述我的问题,但有解决办法吗?使其意识到其值在“x”轴上的“a”和“b”之间,而不是在“1”和“n”之间?
我提前感谢大家的回答
我使用的deSolve行(关于“b”大于“a”):
我试图重建使用循环的“近似”解决方案(实际上是Euler方法)与使用packagedeSolve的解决方案之间的比较。默认情况下,它使用比Euler方法更精确的
lsoda
解算器,但它当然也是近似值(默认相对和绝对公差设置为1e-6)
由于问题遗漏了一些具体值和绘图函数,因此不清楚原始问题在哪里,但以下示例可能有助于重新表述问题。我假设问题可能是两种方法之间的t
(绝对时间)和dt
混淆。将标记为“原始代码”的行与“建议”进行比较:
库(deSolve)
f=函数(t,y){
-2*y+3*t
}
##一些价值观
y0我试图重建使用循环的“近似”解决方案(实际上是Euler方法)与使用packagedeSolve的解决方案之间的比较。默认情况下,它使用比Euler方法更精确的lsoda
解算器,但它当然也是近似值(默认相对和绝对公差设置为1e-6)
由于问题遗漏了一些具体值和绘图函数,因此不清楚原始问题在哪里,但以下示例可能有助于重新表述问题。我假设问题可能是两种方法之间的t
(绝对时间)和dt
混淆。将标记为“原始代码”的行与“建议”进行比较:
库(deSolve)
f=函数(t,y){
-2*y+3*t
}
##一些价值观
y0你是说你得到了正确的y值,但是他们水平移动,因为你不能得到正确的x值?如果是这样的话,将您用于绘图的代码精确地显示出来会很有帮助。我的绘图并不复杂,它是(没有任何装饰):绘图(ddf)线(yt)这里一定有我可以做的事情,但我不确定是什么。所以我基本上是要求绘制想法。你是说你得到了正确的y值,但是它们水平移动,因为你不能得到正确的x值?如果是这样的话,将您用于绘图的代码精确地显示出来会很有帮助。我的绘图并不复杂,它是(没有任何装饰):绘图(ddf)线(yt)这里一定有我可以做的事情,但我不确定是什么。所以我基本上是在要求构思一些想法。谢谢你,成功了!但是我想确保我完全理解,我只是错过了行
中的t
,或者循环中的更改使行
正确?两者是否连接?不确定,因为未显示绘图功能。for
循环中的变化是两个(1,只是化妆品)移动到循环前面的第1行,以及(2,重要)将dt*i
替换为a+dt*i
。谢谢,成功了!但是我想确保我完全理解,我只是错过了行
中的t
,或者循环中的更改使行
正确?两者是否连接?不确定,因为未显示绘图功能。
循环的变化是两个(1,只是化妆品)移动到循环前面的第1行,以及(2,重要)用a+dt*i
替换dt*i
。
yt0=y0
yt=vector("numeric",n)
for (i in 1:(n-1))
{
yt[1]=f(0,yt0)*dt+yt0
yt[i+1]=(f(dt*i,yt[i]))*dt+yt[i]
}
df = function(t, y, params) list(-2*y+3*t)
t = seq(a, b, length.out = n)
ddf = as.data.frame(ode(yt0, t, df, parms=NULL))