我的rk4实现的加权平均值中的不同近似值都是sam

2024-09-27 09:33:59 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我想写一个微分方程数值逼近的四阶龙格库塔方法的实现,这是我数学课程的一部分,也是为了学习一些编程,但问题是它在逼近的每一步中都使用这些系数。我们从一个x值和一个y值开始,它想为后面的x值找到y值,我给它一个步长,通常是0.1,它在x上移了0.1,给了我一个新的y值的近似值,在每一步它都执行4个近似值,我称之为k1,k2,k3和k4。然后取这4个近似值的加权平均值,得到最终的近似值,应该是非常精确的。问题是,对于每一步,我得到k1=k2=k3,但是k4是不同的。这似乎不对。我在一个函数上测试它,输入f(x,y)=2x-3y+1,使用步长h,我的k如下:

k1=f(x,y)
k2=f(x+.5h,y+.5hk1)
k3=f(x+.5h,y+.5hk2)
k4=f(x+h,y+hk3)

所以只要用代数的方法检验一下k1=k2,我得到的结果是9y=1-6x,但是我给它的初始值是(x0,y0)=(1,5),很明显是45=第1-6页

所以这一切似乎都错了。根据教科书,我没有得到正确的答案,而且这些k真的不应该是相同的。总之这是我的密码。在k之间的print语句只是作为一个测试,看看k在循环n时实际上是在变化的

import numpy

def rk4(x0,y0,xf,h,f):
    y=[]
    x=numpy.linspace(x0,xf,(xf-x0)/h+1)
    y.insert(0,y0)
    for n in range(len(x)-1):
        k1=f(x[n],y[n])
        print k1
        k2=f(x[n]+(1/2)*h,y[n]+(1/2)*h*k1)
        print k2
        k3=f(x[n]+(1/2)*h,y[n]+(1/2)*h*k2)
        print k3
        k4=f(x[n]+h,y[n]+h*k3)
        print k4
        y.insert(n+1,y[n]+(h/6)*(k1+2*k2+2*k3+k4))
        print y[n]+(h/6)*(k1+2*k2+2*k3+k4)

    print x
    print y

def twoxminusthreeyplusone(x,y):
    return 2*x-3*y+1

rk4(1,5,1.5,0.1,twoxminusthreeyplusone)

然后我得到这个输出

/usr/bin/python2.7 /home/t/PycharmProjects/untitled/chunk.py
-12.0
-12.0
-12.0
-8.2
3.86333333333
-8.39
-8.39
-8.39
-5.673
3.06961666667
-5.80885
-5.80885
-5.80885
-3.866195
2.52110925
-3.96332775
-3.96332775
-3.96332775
-2.574329425
2.14792644708
-2.64377934125
-2.64377934125
-2.64377934125
-1.65064553888
1.900100743
[ 1.   1.1  1.2  1.3  1.4  1.5]
[5, 3.8633333333333333, 3.0696166666666667, 2.5211092500000003, 2.1479264470833335, 1.9001007429979169]

Process finished with exit code 0

所以我不明白。k是一样的似乎是主要的问题。我尝试过几种不同的方法,比如以前,我没有把k定义为x[n],y[n]的函数,而是让每个k像y一样以一个空列表开始,然后在for循环的每个步骤之后使用.insert(n,x)或者.insert(n-1,x) 这取决于我如何定义每一步,但这似乎是不必要的复杂,我认为实际上结束了同一个问题


Tags: 方法函数numpydefk2k1insertprint
1条回答
网友
1楼 · 发布于 2024-09-27 09:33:59

你有一个典型的问题在一个通常意想不到的点

0.5替换所有因子(1/2)(或用(1/2)*h替换h/2,但尽可能避免除法)。整数除法的结果是0,因此是观察到的行为


但是请注意,在python3中,您的代码可以正常工作,因此必须强制执行整数行为

相关问题 更多 >

    热门问题