【问题标题】:Calculate the value of a function for given coordinates计算给定坐标的函数值
【发布时间】:2021-10-17 21:50:02
【问题描述】:

我是新来的。我想编写一个简洁的小程序来检查我的考试准备的解决方案,因为我的教授没有提供任何解决方案。对于非线性微分方程 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= -5yy1+4*y-u(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() 函数

【问题讨论】:

  • 我觉得这个问题的定义比较不清楚。一个玩具(但更完整)的例子可能会有所帮助。你的输入表达式/输出结果是数字的吗?还是期望具有象征意义?
  • 你能举一个 diff 方程 f 的例子吗?我认为您正在寻找的可以通过sympy 完成
  • 好的,提供一些上下文:这是控制工程的特定部分。 u 是输入信号(例如按下辅助器),y 是输出信号(例如汽车的速度)。为了描述这样的控制系统,我们使用微分方程。通常,它们是非线性的,但在某个点(给定速度)我们可以说它是线性的。所以我们要计算第一个泰勒多项式(或一阶泰勒多项式,我不知道如何用英语称呼它),因为这是一个线性近似。因此,我必须在所述点计算每个变量的方程的导数
  • f = -5*y*y1+4*y-u //y1是y的导数

标签: python equation derivative taylor-series


【解决方案1】:

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

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!')

【讨论】:

    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多