gpt4 book ai didi

julia - Julia 中求解 n 阶多项式根的通用函数

转载 作者:行者123 更新时间:2023-12-01 17:19:27 32 4
gpt4 key购买 nike

全部,

我刚刚开始使用 Julia 语言并且非常喜欢它。在第三个教程的末尾有一个有趣的问题:泛化二次公式,使其求解任意 n-order polynomial equation 的根。 .

这让我觉得 (a) 是一个有趣的编程问题,(b) 是一个有趣的 Julia 问题。有没有人解决了这个问题?作为引用,这里是 Julia 代码和几个玩具示例。同样,我们的想法是让这个函数适用于任何 n 阶多项式。

干杯,

亚伦

function derivative(f)
return function(x)
# pick a small value for h
h = x == 0 ? sqrt(eps(Float64)) : sqrt(eps(Float64)) * x

# floating point arithmetic gymnastics
xph = x + h
dx = xph - x

# evaluate f at x + h
f1 = f(xph)

# evaluate f at x
f0 = f(x)

# divide the difference by h
return (f1 - f0) / dx
end
end


function quadratic(f)

f1 = derivative(f)

c = f(0.0)

b = f1(0.0)

a = f(1.0) - b - c

return (-b + sqrt(b^2 - 4a*c + 0im))/2a, (-b - sqrt(b^2 - 4a*c + 0im))/2a
end

quadratic((x) -> x^2 - x - 2)
quadratic((x) -> x^2 + 2)

最佳答案

包裹PolynomialRoots.jl提供函数 roots() 来查找任意阶多项式的所有(实数和复数)根。唯一的强制参数是包含多项式系数的升序数组。

例如,为了找到根

6x^5 + 5x^4 + 3x^2 + 2x + 1

加载包后(使用 PolynomialRoots),您可以使用

julia> roots([1, 2, 3, 4, 5, 6])
5-element Array{Complex{Float64},1}:
0.294195-0.668367im
-0.670332+2.77556e-17im
0.294195+0.668367im
-0.375695-0.570175im
-0.375695+0.570175im

该包是本文中描述的寻根算法的 Julia 实现:http://arxiv.org/abs/1203.1034

PolynomialRoots.jl 还支持任意精度计算。这对于求解无法以 double 求解的方程非常有用。例如

julia> r = roots([94906268.375, -189812534, 94906265.625]);

julia> (r[1], r[2])
(1.0000000144879793 - 0.0im,1.0000000144879788 + 0.0im)

给出多项式的错误结果,而是以任意精度传递输入数组,强制进行任意精度计算以提供正确的答案(请参阅 https://en.wikipedia.org/wiki/Loss_of_significance ):

julia> r = roots([BigFloat(94906268.375), BigFloat(-189812534), BigFloat(94906265.625)]);

julia> (Float64(r[1]), Float64(r[2]))
(1.0000000289759583,1.0)

关于julia - Julia 中求解 n 阶多项式根的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22588709/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com