我正在尝试在python中解决Du / Dt = F(u)形式的Odes系统,我怀疑我可能在某处犯了一个相当愚蠢的错误。
从技术上讲,F(u)实际上是u相对于另一个变量y的二阶导数,但在实践中我们可以认为它是一个系统和一些函数。
#Settings#
minx = -20
h = float(1)
w = float(10)
U0 = float(10)
Nt = 10
Ny = 10
tmax = 10
v=float(1)
#Arrays#
y = np.linspace(0,h,Ny)
t = np.linspace(0,tmax,Nt)
#Variables from arrays#
dt = t[1]-t[0]
p = [0]*(Nt)
delta = y[1] - y[0]
def zo(y):
return math.cos(y/(2*math.pi))
z0 = [zo(i) for i in y]
def df(t,v1):
output = np.zeros(len(y))
it = 1
output[0] = math.cos(w*t)
output[len(y)-1] = math.cos(w*t)
while it < len(y)-1:
output[it] = ( v1[it - 1] + v1[it + 1] - 2 * v1[it] ) * ( v / ( ( delta )**2 ))
it += 1
return output
r = ode(df).set_integrator('zvode', method='bdf',order =15)
r.set_initial_value(z0, 0)
it=0
while r.successful() and r.t < tmax:
p[it] = r.integrate(r.t+dt)
it+=1
print(z0-p[0])
print(p[1])
现在问题是双重的:
- 首先,最初的“条件”即p [0]似乎已经关闭。 (这可能只是因为ode函数的工作方式,所以我不知道这是否正常)
- 第二,p [1]和之后的所有p只是0。
因此,由于某种原因,ode函数立即失败...(您可以通过在初始化p时将值更改为1来检查)
除了我知道这种方法应该有效。 毕竟这是matlab中ode45的“等价物”,绝对有效。
答案 0 :(得分:0)
如果你想使用Dormand-Price rk45 resp,为什么选择一个具有相当高阶的隐式后向微分公式的复数求解器。 dopri5?
还请更正CREATE proc [dbo].[update]
@tablo nvarchar(100),
@kayit nvarchar(50),
@inceleme nvarchar(50),
@icevap nvarchar(50),
@tespit nvarchar(MAX),
@scevap nvarchar(MAX),
@aksiyon nvarchar(50),
@mutalaa nvarchar(MAX),
@tamamlanma nvarchar(100),
@not nvarchar(MAX),
@izleme nvarchar(50),
@kaydeden nvarchar(50),
@idd int,
@kullanici nvarchar(50),
@yil int,
@donem int
as
select ID
into #a from @tablo WITH(NOLOCK)
where yil=@yil and donem=@donem and action=0 and (first is null or first
='') and (1=@kullanici or 2=@kullanici or 3=@kullanici)
IF EXISTS(SELECT * FROM #a WHERE ID=@idd) BEGIN
update @tablo
set
kayitzamani=@kayit,
iincelendimi=@inceleme,
icevapisteniyormu=@icevap,
itespit=@tespit,
isubecevabi=@scevap,
iaksiyontarihi=@aksiyon,
isonmutalaa=@mutalaa,
ieksikligintamamlanmasekli=@tamamlanma,
inotlar=@not,
izlenecekmi=@izleme,
ilkkaydeden=@kaydeden
where
ID=@idd
END
ELSE BEGIN
update @tablo
set
kayitzamani=@kayit,
iincelendimi=@inceleme,
icevapisteniyormu=@icevap,
itespit=@tespit,
isubecevabi=@scevap,
iaksiyontarihi=@aksiyon,
isonmutalaa=@mutalaa,
ieksikligintamamlanmasekli=@tamamlanma,
inotlar=@not,
izlenecekmi=@izleme,
sonkaydeden=@kaydeden
where
ID=@idd
END;
GO
中的循环缩进。为什么for循环不在范围内(1,len(y)-1)?
目前的情况df
包含第一步之后的解决方案点,位于p[0]
。您必须明确指定t=1*dt
并启动p[0]=z0
以获取it=1
中的完整解决方案路径。检查p
的长度,可能需要p
。