加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 有丘直方 于 2018-8-13 21:52 编辑
去年6R关掉之后我就对于自己的账号里面的东西非常惋惜啊!
结果过了那么久才发现原来我的东西全都跑到这里(rpg.blue)来了!
真是相见恨晚!
刚刚瞎写了个解方程用的代码: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
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
使用Newton法。
使用方法:先定义一个提供call(x)方法的对象f作为函数,然后调用solve(f, ini)即可返回这个函数的实零点中距离ini最近的那个……
指定的dx和eps越小精度越高……
如果算出来方程无解可以尝试把times调大一点……
令我没想到的是写完这个代码居然测试一遍就成功……
测试用代码:def function(x) 3*x**3-2*x**2+12*x-123 end f = method(:function) p solve(f) # => 3.2726090206620366
def function(x)
3*x**3-2*x**2+12*x-123
end
f = method(:function)
p solve(f) # => 3.2726090206620366
经过MATLAB检验,确实是正确的解,而且精度还挺高的…… |