首页 文章

在没有Scipy的情况下在python中解决x,[关闭]

提问于
浏览
0

我正在尝试使用任何scipy功能来解决Python without 中的等式 . c = 5,等式为c = 10-20(exp(-0.15 * x)-exp(-0.5 * x)) . 如何解决x,公差为.0001 .

请原谅我的介绍级别编程这里的人 . 这是我参加过的第一堂课 .

从math import exp c = 5 def x(c):c = 10 - 20(exp *( - 0.15 * x) - exp *( - 0.5 * x))return x(5)

2 回答

  • 0

    你可能想看看SymPy . 它正在寻找一个"stock" /标准库解决方案,然后正如其他人提到的那样你将不得不做一些功课并可能实现你自己的求解器 .

    最后的想法是,除非这是一个课堂作业或你的老板对第三方开源库有一种病态的仇恨,否则没有充分的理由不使用其中一个SciPy软件包 . IIRC,它们主要是用Python模块包装的高度优化的C二进制文件实现的,因此您可以获得极快的性能和Python API的易用性 .

  • 1

    看起来你想“从头开始”实现这个目标 . 一些提示:

    • 我们可以用代数简化这一点 . 你真正想要的是找到x使得exp(-0.15 * x)exp(-0.5 * x) - 0.2 = 0

    • 对于给定的x值,您知道自己有多少错误 . 例如,如果x = 1,则c(1)= 1.267,因此您的错误为1.267 . 您需要保留"guessing"值,直到您的错误小于0.0001 .

    • 数学告诉我们这个函数是单调递减的;所以,没有必要检查1左边的答案 .

    希望你能从这些提示中解决它 . 但这应该是一个答案,所以这里是代码:

    def theFunction(x): return exp(-0.15*x) + exp(-0.5*x) - 0.2
    error = 1.267
    x = 1
    littleBit = 1
    while (abs(error) > 0.0001):
      if error > 0: x += littleBit
      else: x -= littleBit
      oldError = error
      error = theFunction(x)
      if (error*oldError < 0): littleBit *= 0.5 
    print x
    

    注意,循环中的最后三行有点'聪明' - 一个更简单的解决方案就是设置littleBit = 0.00001并在整个程序中保持不变(这会慢很多,但仍然可以完成工作) . 作为练习,我建议尝试以这种更简单的方式实现它,然后计算两种方式的时间,并看看你是否可以找出节省时间的地方 .

相关问题