在i = 2时开始求和值

时间:2017-11-18 17:45:13

标签: python python-3.x

我试图用h绘制这个算法的错误,我遇到了一个问题,对于这个错误计算,它不能使用第一个值,因为它除了0/0。如何忽略x = 0的第一个值?我基本上需要在第46行的i = 2上开始求和(绝对误差一)。非常感谢任何帮助

import numpy 
import matplotlib.pyplot as pyplot
from scipy.optimize import fsolve
from matplotlib import rcParams
rcParams['font.family'] = 'serif'
rcParams['font.size'] = 16
rcParams['figure.figsize'] = (12,6)
printing = False



def rk3(A, bvector, y0, interval, N):
    h = (interval[1] - interval[0]) / N
    x = numpy.linspace(interval[0], interval[1], N+1)
    y = numpy.zeros((len(y0), N+1))
    y[:, 0] = y0
    b = bvector

    for i in range(N):
        y_1 = y[:, i] + h *(numpy.dot(A, y[:, i]) + b(x[i]))
        y_2= (3/4)*y[:, i] + 0.25*y_1+0.25* h* (numpy.dot(A,y_1)+b(x[i]+h))
        y[:, i+1] = (1/3)*y[:, i] + (2/3)*y_2 + (2/3)*h*(numpy.dot(A,y_2)+b(x[i]+h))

    return x, y

def exact( interval, N):
     w = numpy.linspace(interval[0], interval[1], N+1)
     z = numpy.array([numpy.exp(-1000*w),(1000/999)*(numpy.exp(-w)-numpy.exp(-1000*w))])
     return w, z

A=numpy.array([[-1000,0],[1000,-1]])
def bvector(x):
    return numpy.zeros(2)
y0=numpy.array([1,0])
interval=numpy.array([0,0.1])

N=numpy.arange(40,401,40)
h=numpy.zeros(len(N))
abs_err = numpy.zeros(len(N))
for i in range(len(N)):
    interval=numpy.array([0,0.1])
    h[i]=(interval[1] - interval[0]) / N[i]
    x, y = rk3(A, bvector, y0, interval, N[i])
    w,z=exact(interval,N[i])
    abs_err[i] = h[i]*numpy.sum(numpy.abs((y[1,:]-z[1,:])/z[1,:]))
p = numpy.polyfit(numpy.log(h), numpy.log(abs_err),1)

fig = pyplot.figure(figsize = (12, 8), dpi = 50)
pyplot.loglog(h, abs_err, 'kx')
pyplot.loglog(h, numpy.exp(p[1]) * h**(p[0]), 'b-')
pyplot.xlabel('$h$', size = 16)
pyplot.ylabel('$|$Error$|$', size = 16)

pyplot.show()

1 个答案:

答案 0 :(得分:0)

只需为零值添加一个if。例如,如果分割变量是x。

if x>0:
    #code here for the calculation

上面的代码将使用所有正的非零值。只跳过零使用此

if x!=0:

你也可以使用for循环的三个参数:

for a in range(start_value, end_value, increment):

所以这意味着

for a in range(2,10,2):
    print a

会给你以下结果 2 4 6 8