查看: 2021|回复: 6

[胡扯] 啊我居然才发现这个站点啊

[复制链接]
梦石
0
星屑
1944
在线时间
404 小时
注册时间
2015-8-30
回帖
322
发表于 2018-8-13 21:50:03 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 有丘直方 于 2018-8-13 21:52 编辑

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

刚刚瞎写了个解方程用的代码:[pre lang="ruby"]def solve(f, ini = 0, dx = 1.0e-8, eps = 1.0e-8, times = 100)
  res = ini
  times.times do
    x = res
    y = f.call(res)
    return res if y.abs <= eps
    res = linear_solve(*point_slope_to_linear_function(x, y, diff(f, x, dx)))
  end
  return
end
def diff(f, x, dx = 1.0e-8)
  d1 = (f.call(x) - f.call(x-dx)) / dx
  d2 = (f.call(x+dx) - f.call(x)) / dx
  (d1+d2) / 2
end
def linear_solve(k, b)
  -b/k
end
def point_slope_to_linear_function(x, y, k)
  [k, y-x*k]
end[/pre]使用Newton法。
使用方法:先定义一个提供call(x)方法的对象f作为函数,然后调用solve(f, ini)即可返回这个函数的实零点中距离ini最近的那个……
指定的dx和eps越小精度越高……
如果算出来方程无解可以尝试把times调大一点……
令我没想到的是写完这个代码居然测试一遍就成功……
测试用代码:[pre lang="ruby"]def function(x)
  3*x**3-2*x**2+12*x-123
end
f = method(:function)
p solve(f) # => 3.2726090206620366[/pre]经过MATLAB检验,确实是正确的解,而且精度还挺高的……

评分

参与人数 1赞 +1 收起 理由
Vortur + 1 塞糖

查看全部评分

小仙女一枚~
梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2018-8-13 22:58:02 | 显示全部楼层
这个……不需要算 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
复制代码

点评

一定要这么做的话,可以随机选择使用d1或者d2,反正切线法也不在乎这些……  发表于 2018-8-15 21:05
确实……我的本意是计算的近似左导数和近似右导数的平均数来算出近似导数  发表于 2018-8-15 20:53
我的意思是你d1+d2,f.call(x)那一项抵消了  发表于 2018-8-14 18:17
我在这里是算导数的近似值,那你觉得这里咋算嘞  发表于 2018-8-14 13:51
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

发表于 2018-8-13 23:07:57 | 显示全部楼层
因为名字和RM没扯上关系。
就搜索不到。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部