Project1

标题: 啊我居然才发现这个站点啊 [打印本页]

作者: 有丘直方    时间: 2018-8-13 21:50
标题: 啊我居然才发现这个站点啊
本帖最后由 有丘直方 于 2018-8-13 21:52 编辑

去年6R关掉之后我就对于自己的账号里面的东西非常惋惜啊!
结果过了那么久才发现原来我的东西全都跑到这里(rpg.blue)来了!
真是相见恨晚!

刚刚瞎写了个解方程用的代码:
RUBY 代码复制
  1. def solve(f, ini = 0, dx = 1.0e-8, eps = 1.0e-8, times = 100)
  2.   res = ini
  3.   times.times do
  4.     x = res
  5.     y = f.call(res)
  6.     return res if y.abs <= eps
  7.     res = linear_solve(*point_slope_to_linear_function(x, y, diff(f, x, dx)))
  8.   end
  9.   return
  10. end
  11. def diff(f, x, dx = 1.0e-8)
  12.   d1 = (f.call(x) - f.call(x-dx)) / dx
  13.   d2 = (f.call(x+dx) - f.call(x)) / dx
  14.   (d1+d2) / 2
  15. end
  16. def linear_solve(k, b)
  17.   -b/k
  18. end
  19. def point_slope_to_linear_function(x, y, k)
  20.   [k, y-x*k]
  21. end
使用Newton法。
使用方法:先定义一个提供call(x)方法的对象f作为函数,然后调用solve(f, ini)即可返回这个函数的实零点中距离ini最近的那个……
指定的dx和eps越小精度越高……
如果算出来方程无解可以尝试把times调大一点……
令我没想到的是写完这个代码居然测试一遍就成功……
测试用代码:
RUBY 代码复制
  1. def function(x)
  2.   3*x**3-2*x**2+12*x-123
  3. end
  4. f = method(:function)
  5. p solve(f) # => 3.2726090206620366
经过MATLAB检验,确实是正确的解,而且精度还挺高的……
作者: guoxiaomi    时间: 2018-8-13 22:58
这个……不需要算 f(x) 的值吧
  1. d1 = (f.call(x) - f.call(x-dx)) / dx
  2. d2 = (f.call(x+dx) - f.call(x)) / dx
  3. (d1+d2) / 2
复制代码

作者: yang1zhi    时间: 2018-8-13 23:07
因为名字和RM没扯上关系。
就搜索不到。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1