1

我刚来这地方。我想编写一个简洁的小程序来检查我的考试准备的解决方案,因为我的教授没有提供任何解决方案。对于非线性微分方程 f,我想找到第一个泰勒多项式。因此,我对每个变量取 f 的导数。现在我的问题是:我必须计算某个给定点的每个导数的值。对于仅存储在变量中且在计算时未明确知道的此类复杂表达式,我该如何做到这一点?

这就是我现在所做的,没有评估:

f = input('Enter function: ')
fy1 = diff(f,y1)
fy = diff(f,y)
fu2 = diff(f,u2)
fu1 = diff(f,u1)
fu = diff(f,u)

我尝试了这个函数,因为我希望它会自动识别 f 中的变量:

def calculate(f,y1,y,u2,u1,u):
    return f

...

fy1 = calculate(diff(f,y1),0,-1,0,0,-4)
fy = calculate(diff(f,y),0,-1,0,0,-4)
fu2 = calculate(diff(f,u2),0,-1,0,0,-4)
fu1 = calculate(diff(f,u1),0,-1,0,0,-4)
fu = calculate(diff(f,u),0,-1,0,0,-4)

编辑:

我尝试了其他方法:对于 f= -5 y y1+4*yu(y1 是 y 的导数),fy1 是 f 对 y1 的导数:

fy1= diff(f, y1)
fy1.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
print("{}".format(fy1))

但是 subs() 没有替换任何值,因为输出如下:

-5*y

我想这与将变量定义为 sympy 符号有关吗?

y1 = symbols('y1')
y = symbols('y')
u2 = symbols('u2')
u1 = symbols('u1')
u = symbols('u')

但我需要 sympy diff() 函数

4

1 回答 1

0

我现在的解决方案几乎就是我在第一次编辑中写的。我没有意识到替换不是永久性的,我不得不将解决方案存储在一个额外的变量中。这是完整的程序。我愿意接受从各个方面改进它的建议。

from sympy import diff, symbols

again = True

while(again):

    y1 = symbols('y1')
    y = symbols('y')
    u2 = symbols('u2')
    u1 = symbols('u1')
    u = symbols('u')
    
    f = input('Enter function: ')
    
    fy1= diff(f, y1)
    res_fy1 = fy1.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
    print("{}".format(res_fy1))
    
    fy= diff(f, y)
    res_fy = fy.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
    
    fu2= diff(f, u2)
    res_fu2 = fu2.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
    
    fu1= diff(f, u1)
    res_fu1 = fu1.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
    
    fu= diff(f, u)
    res_fu = fu.subs([(y1,0),(y,-1),(u2,0),(u1,0),(u,-4)])
    
    print('delta_y2 + (' + str(res_fy1) + ')*delta_y1 + (' + str(res_fy) + ')*delta_y + (' + str(res_fu2) + ')*delta_u2 + (' + str(res_fu1) + ')*delta_u1 + (' + str(res_fu) + ')*delta_u')      
    
    wrongInput = True    
    while (wrongInput):
        i = input('Another function? [y/n] ')
    
        if (i == 'n'):
            again = False
            wrongInput = False
    
        elif (i == 'y'):
            wrongInput = False
        
        else:
            print('Wrong Input!')
于 2021-08-15T16:38:52.230 回答