编辑代码

import sympy
from sympy import diff
from sympy import symbols

#差分的对象
x = 20
k = 1  #步长
x1 = x + k  #向前
x2 = x - k  #向后

#方程式
def func(t): #def定义函数名 用return返回
    return 2000 * sympy.log(14*10000/(14*10000-2100*t))-9.8*t#sympy.log求对数

#一阶向前差分
def for_difference():
    a_for_diff = (func(x1) - func(x))/k
    for_error = abs(a_for_diff - a_true)/a_true
    print(f'{x}的一阶向前差分值:{a_for_diff}')
    print(f'{x}的一阶向前差分的误差:{for_error*100}%')

if __name__ == '__main__':
    t = symbols("t")#定义t为一个符号表示一个变量
    a_true = diff(func(t), t).subs(t, x)  # 真值
    for_difference()
#一阶向后差分
def beh_difference():
    a_beh_diff = (func(x) - func(x2))/k
    beh_error = abs(a_beh_diff - a_true)/a_true
    print(f'{x}的一阶向后差分值:{a_beh_diff}')
    print(f'{x}的一阶向后差分的误差:{beh_error*100}%')

if __name__ == '__main__':
    t = symbols("t")
    a_true = diff(func(t), t).subs(t, x)  # 真值
    beh_difference()
#一阶中心差分
def cen_difference():
    a_cen_diff = (func(x1)-func(x2))/(k*2)
    cen_error = abs(a_cen_diff - a_true)/a_true
    print(f'{x}的一阶中心差分值:{a_cen_diff}')
    print(f'{x}的一阶中心差分的误差:{cen_error*100}%')

if __name__ == '__main__':
    t = symbols("t")
    a_true = diff(func(t), t).subs(t, x)  # 真值
    cen_difference()
#二阶中心差分
def two_cen_difference():
    a_cen_diff = (func(x1)+func(x2)-2*func(x))/(k**2)
    cen_error = abs(a_cen_diff - a_true)/a_true
    print(f'{x}的二阶中心差分值:{a_cen_diff}')
    print(f'{x}的二阶中心差分的误差:{cen_error*100}%')

if __name__ == '__main__':
    t = symbols("t")
    a_true = diff(func(t), t , 2).subs(t, x)  # 求2阶导真值
    two_cen_difference()