gpt4 book ai didi

julia - 在某点绘制与函数相切的线

转载 作者:行者123 更新时间:2023-12-03 16:01:03 25 4
gpt4 key购买 nike

这是一段代码,它在一个范围内以及单个输入上绘制一个函数:

a = 1.0
f(x::Float64) = -x^2 - a
scatter(f, -3:.1:3)
scatter!([a], [f(a)])
enter image description here
我想绘制与该点相切的线,如下所示:
enter image description here
是否有这样做的模式或简单工具?

最佳答案

这取决于您所说的“模式或简单工具”的含义 - 最简单的方法是手动导出导数,然后将其绘制为函数:

hand_gradient(x) = -2x
然后将 plot!(hand_gradient, 0:0.01:3) 添加到您的绘图中。
当然,对于更复杂的函数或者当你想要绘制大量梯度时,这可能会有点乏味,所以另一种方法是利用 Julia 出色的自动微分功能。比较所有不同的选项有点超出这个答案的范围,但如果你有兴趣,请查看 https://juliadiff.org/。在这里,我将使用广泛使用的 Zygote 库:
julia> using Plots, Zygote

julia> a = 1.0;

julia> f(x) = -x^2 - a;
[注意我已经稍微修改了您的 f 定义以符合您发布的图,这是一条倒抛物线]
请注意,这里我没有将输入参数 x 的类型限制为 f - 这对于自动区分工作至关重要,因为它是通过您的函数运行不同的数字类型( Dual)来实现的。一般来说,以这种方式限制参数类型在 Julia 中是一种反模式——它无助于提高性能,但会使您的代码与生态系统的其他部分的互操作性降低,如果您尝试通过 f(x::Float64) 自动区分,您可以在此处看到。
现在让我们使用 Zygote 为我们提供渐变:
julia> f'
#43 (generic function with 1 method)
如您所见,运行 f' 现在返回一个匿名函数 - 这是 f 的派生函数,您可以通过在特定点评估它来验证:
julia> f'(2)
-4.0
现在我们需要做的就是利用它来构造一个函数,该函数本身返回一个跟踪渐变线的函数:
julia> gradient_line(f, x₀) = (x -> f(x₀) + f'(x₀)*(x-x₀))
gradient_line (generic function with 1 method)
这个函数接受一个函数 f 和一个我们想要获取切线的点 x₀,然后返回一个匿名函数,该函数返回每个 x 值处的切线值。使用它:
julia> default(markerstrokecolor = "white", linewidth = 2);

julia> scatter(f, -3:0.1:3, label = "f(x) = -x² - 1", xlabel = "x", ylabel = "f(x)");

julia> scatter!([1], [f(1)], label = "", markersize = 10);

julia> plot!(gradient_line(f, 1), 0:0.1:3, label = "f'(1)", color = 2);

julia> scatter!([-2], [f(-2)], label = "", markersize = 10, color = 3);

julia> plot!(gradient_line(f, -2), -3:0.1:0, label = "f'(-2)", color = 3)
enter image description here

关于julia - 在某点绘制与函数相切的线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66236968/

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