【发布时间】:2021-12-29 12:41:00
【问题描述】:
我有这样一个任务:
您需要编写一个具有以下签名的函数: def derForward(f, I, h) 这个函数应该作为输入函数????和段????作为两个元素的 Python 列表 --- 段的末端。 在功能中,您被要求划分段????分成长度为 ℎ 的小段,从而得到一个网格 ???? .您的函数应返回 dy --- 每个点 x 的前向差异(边界除外,因为公式要求下一个值)。您应该返回相同长度的 x 和 dy 数组。
我的答案是这样的:
xx = [] #list of x values
frw = [] #list of forw. differencies of x
def derForward(f, I, h):
x = np.arange(I[0], I[1], h)
f = np.vectorize(f)
for x_ in x[:-1]:
dxdy = (f(x_+h)-f(x_))/ h
xx.append(x_)
frw.append(dxdy)
x = np.array(xx)
dy = np.array(frw)
return x, dy
此函数必须通过 3 次错误和准确性测试。但是现在测试 2 和 3 都失败了。我不明白为什么我只能通过 1 次测试。 检查器如下所示:
import numpy as np
from math import *
from time import time
def findif_check(derForward):
count=0
I=[0.001, 2*np.pi]
f=lambda x: sin(x)
h=0.01
st=time()
x, dy=derForward(f, I, h)
dur=time()-st
if x.shape[0]!=dy.shape[0]:
print('FAILED: x and dy shape mismatch!')
else:
df=lambda x: cos(x)
err=np.max(np.abs(dy-np.vectorize(df)(x)))
print('Test 1 |::| err=', np.max(np.abs(dy-np.cos(x))), ' |::| time: ', dur, 's')
if err<2*0.0075:
count+=1
print('Test 1 |::| accuracy OK')
else:
print('Test 1 |::| accuracy FAIL')
f=lambda x: x**x
I=[0.001, 1]
st=time()
x, dy=derForward(f, I, h)
dur=time()-st
df=lambda x: x**x*(log(x)+1)
err=np.max(np.abs(dy-np.vectorize(df)(x)))
print('Test 2 |::| err=', err, ' |::| time: ', dur, 's')
if err<2:
count+=1
print('Test 2 |::| accuracy OK')
else:
print('Test 2 |::| accuracy FAIL')
f=lambda x: e**(-x**2)
I=[0.001, 1]
st=time()
x, dy=derForward(f, I, h)
dur=time()-st
df=lambda x: -2*x*e**(-x**2)
err=np.max(np.abs(dy-np.vectorize(df)(x)))
print('Test 3 |::| err=', err, ' |::| time: ', dur, 's')
if err<2*0.01:
count+=1
print('Test 3 |::| accuracy OK')
else:
print('Test 3 |::| accuracy FAIL')
print('Passed: ', count, '/ 3')
【问题讨论】: