Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
算法11.2非线性放炮法(负担和公平)Python_Python_Python 3.x_Numerical Analysis - Fatal编程技术网

算法11.2非线性放炮法(负担和公平)Python

算法11.2非线性放炮法(负担和公平)Python,python,python-3.x,numerical-analysis,Python,Python 3.x,Numerical Analysis,我正试图从数值分析(负担和公平)中编程基于算法11.2的非线性射击方法。然而,在运行程序后,我得到的数值结果与教科书中的答案不同。我认为我的编码有问题,但我无法理解。我在图片中附上了实际的算法。 这是密码 from numpy import zeros, abs def shoot_nonlinear(a,b,alpha, beta, n, tol, M): w1 = zeros(n+1) w2 = zeros(n+1) h = (b-a)/n k =

我正试图从数值分析(负担和公平)中编程基于算法11.2的非线性射击方法。然而,在运行程序后,我得到的数值结果与教科书中的答案不同。我认为我的编码有问题,但我无法理解。我在图片中附上了实际的算法。

这是密码

from numpy import zeros, abs

def shoot_nonlinear(a,b,alpha, beta, n, tol, M):

    w1 = zeros(n+1)  
    w2 = zeros(n+1)
    h = (b-a)/n
    k = 1
    TK = (beta - alpha)/(b - a)

    print("i""  x" "     " "W1""     " "W2")
    while k <= M:

        w1[0] = alpha
        w2[0] = TK
        u1    = 0
        u2    = 1

        for i in range(1,n+1):
            x = a + (i-1)*h     #step 5

            t = x + 0.5*(h)

            k11 = h*w2[i-1]     #step 6

            k12 = h*f(x,w1[i-1],w2[i-1])
            k21 = h*(w2[i-1] + (1/2)*k12)
            k22 = h*f(t, w1[i-1] + (1/2)*k11, w2[i-1] + (1/2)*k12)
            k31 = h*(w2[i-1] + (1/2)*k22)
            k32 = h*f(t, w1[i-1] + (1/2)*k21, w2[i-1] + (1/2)*k22)
            t   = x + h
            k41 = h*(w2[i-1]+k32)
            k42 = h*f(t, w1[i-1] + k31, w2[i-1] + k32)
            w1[i] = w1[i-1] + (k11 + 2*k21 + 2*k31 + k41)/6
            w2[i] = w2[i-1] + (k12 + 2*k22 + 2*k32 + k42)/6   
            kp11 = h*u2
            kp12 = h*(fy(x,w1[i-1],w2[i-1])*u1 + fyp(x,w1[i-1], w2[i-1])*u2)
            t    = x + 0.5*(h)
            kp21 = h*(u2 + (1/2)*kp12)
            kp22 = h*((fy(t, w1[i-1],w2[i-1])*(u1 + (1/2)*kp11)) + fyp(x+h/2, w1[i-1],w2[i-1])*(u2 +(1/2)*kp12))
            kp31 = h*(u2 + (1/2)*kp22)
            kp32 = h*((fy(t, w1[i-1],w2[i-1])*(u1 + (1/2)*kp21)) + fyp(x+h/2, w1[i-1],w2[i-1])*(u2 +(1/2)*kp22))
            t    = x + h
            kp41 = h*(u2 + kp32)
            kp42 = h*(fy(t, w1[i-1], w2[i-1])*(u1+kp31) + fyp(x + h, w1[i-1], w2[i-1])*(u2 + kp32))
            u1 = u1 + (1/6)*(kp11 + 2*kp21 + 2*kp31 + kp41)
            u2 = u2 + (1/6)*(kp12 + 2*kp22 + 2*kp32 + kp42)


        r = abs(w1[n]) - beta
        #print(r)
        if r < tol:
            for i in range(0,n+1):
                x = a + i*h
                print("%.2f %.2f %.4f %.4f" %(i,x,w1[i],w2[i]))
            return

        TK = TK -(w1[n]-beta)/u1

        k = k+1


    print("Maximum number of iterations exceeded")   
    return
我的成绩

i      x     W1      W2
0.00 1.00 17.0000 -16.2058
1.00 1.10 15.5557 -12.8379
2.00 1.20 14.4067 -10.2482
3.00 1.30 13.4882 -8.1979
4.00 1.40 12.7544 -6.5327
5.00 1.50 12.1723 -5.1496
6.00 1.60 11.7175 -3.9773
7.00 1.70 11.3715 -2.9656
8.00 1.80 11.1203 -2.0783
9.00 1.90 10.9526 -1.2886
10.00 2.00 10.8600 -0.5768
11.00 2.10 10.8352 0.0723
12.00 2.20 10.8727 0.6700
13.00 2.30 10.9678 1.2251
14.00 2.40 11.1165 1.7444
15.00 2.50 11.3157 2.2331
16.00 2.60 11.5623 2.6951
17.00 2.70 11.8539 3.1337
18.00 2.80 12.1883 3.5513
19.00 2.90 12.5635 3.9498
20.00 3.00 12.9777 4.3306
w1的实际结果

x     W1
1.0   17.0000
1.1   15.7555
1.2   14.7734
1.3   13.3886
1.4   12.9167
1.5   12.5601
1.6   12.3018
1.7   12.1289
1.8   12.0311
1.9   12.0000
2.0   12.0291
2.1   12.1127
2.2   12.2465
2.3   12.4267 
2.4   12.6500
2.5   12.9139
2.6   13.2159
2.7   13.5543
2.8   13.9272
2.9   14.3333
3.0   14.7713
作为fx=(1/8)*(32+2*x**3-y*yp)中的注释,1/8将给出结果0。 您应该使用1./8来代替。

在第48行,您有

r = abs(w1[n]) - beta
而不是

r = abs(w1[n] - beta)
进行此更改将给出与文本相同的解决方案

x     W1
1.0   17.0000
1.1   15.7555
1.2   14.7734
1.3   13.9978
1.4   13.3886
1.5   12.9167
1.6   12.5601
1.7   12.3018
1.8   12.1289
1.9   12.0311
2.0   12.0000
2.1   12.0291
2.2   12.1127
2.3   12.2465
2.4   12.4267 
2.5   12.6500
2.6   12.9139
2.7   13.2159
2.8   13.5543
2.9   13.9272
3.0   14.3333

(1/8)=0(1/8)=0.125考虑将所有方程改变为使用浮点数。使用浮点数后仍然是相同的结果。这不能是解决方案,因为在Python 3中没有1/8和1/8之间的差别。在这种情况下,问题可能仅仅是算法如何被翻译成代码(可能是一个键入)。那么,这个问题也许应该接近了???还有一件事,为什么在代码中引入了变量t?
x     W1
1.0   17.0000
1.1   15.7555
1.2   14.7734
1.3   13.9978
1.4   13.3886
1.5   12.9167
1.6   12.5601
1.7   12.3018
1.8   12.1289
1.9   12.0311
2.0   12.0000
2.1   12.0291
2.2   12.1127
2.3   12.2465
2.4   12.4267 
2.5   12.6500
2.6   12.9139
2.7   13.2159
2.8   13.5543
2.9   13.9272
3.0   14.3333