Plot 在mathematica中,如何求解函数的正根并将其作为函数图上的点绘制?
我试图绘制以下函数,并在图上指出函数通过45度坡度的位置。我已经能够使用以下代码绘制函数本身:Plot 在mathematica中,如何求解函数的正根并将其作为函数图上的点绘制?,plot,wolfram-mathematica,equation,Plot,Wolfram Mathematica,Equation,我试图绘制以下函数,并在图上指出函数通过45度坡度的位置。我已经能够使用以下代码绘制函数本身: T = 170 Degree; f[s_, d_] = Normal[Series[Tan[T - (d*s)], {s, 0, 4}]]; r[h_, d_] = Simplify[Integrate[f[s, d], {s, 0, h}]]; a[h_] = Table[r[h, d], {d, 1, 4, .5}]; Plot[a[h], {h, 0, 4}, PlotRange -> {
T = 170 Degree;
f[s_, d_] = Normal[Series[Tan[T - (d*s)], {s, 0, 4}]];
r[h_, d_] = Simplify[Integrate[f[s, d], {s, 0, h}]];
a[h_] = Table[r[h, d], {d, 1, 4, .5}];
Plot[a[h], {h, 0, 4}, PlotRange -> {{0, 4}, {0, -4}}, AspectRatio -> 1]
我需要在每条曲线上显示坡度超过45度的点。然而,由于solve和Reduce函数中表的阴影有些奇怪,我至今无法对数字进行偶数求解。我试过:
Reduce[{a'[h] == Table[-1, {Dimensions[a[h]][[1]]}], h >= 0}, h]
但我显然不能用这种函数来做这件事,而且我不知道如何将这些结果添加到绘图中,以便每条线在交叉处都有一个标记。有人知道如何设置吗?为了完整起见,这是您的代码,对绘图参数进行了轻微修改,以放大感兴趣的区域:
Clear[d,h,T,f,r,a];
T = 170 Degree;
f[s_, d_] = Normal[Series[Tan[T - (d*s)], {s, 0, 4}]];
r[h_, d_] = Simplify[Integrate[f[s, d], {s, 0, h}]];
a[h_] = Table[r[h, d], {d, 1, 4, .5}];
plot = Plot[a[h], {h, 0, 4}, PlotRange -> {{0, 0.8}, {0, -0.5}},
AspectRatio -> 1, Frame -> {False, True, True, False},
FrameStyle -> Directive[FontSize -> 10],
PlotStyle -> {Thickness[0.004]}]
以下是获得解决方案(h坐标)的代码:
现在制作绘图:
points = ListPlot[MapIndexed[{#1, a[#1][[First@#2]]} &, solutions[[All, 2]]],
PlotStyle -> Directive[PointSize[0.015], Red],
PlotRange -> {{0, 0.8}, {0, -0.5}}, AspectRatio -> 1,
Frame -> {False, True, True, False},
FrameStyle -> Directive[FontSize -> 10]]
最后,结合这些图:
Show[{plot, points}]
编辑:
响应在发现点切割图的请求-以下是一种方法:
plot =
With[{sols = solutions[[All, 2]]},
Plot[Evaluate[a[h]*UnitStep[sols - h]], {h, 0, 4},
PlotRange -> {{0, 0.8}, {0, -0.5}}, AspectRatio -> 1,
Frame -> {False, True, True, False},
FrameStyle -> Directive[FontSize -> 10],
PlotStyle -> {Thickness[0.004]}]]
这应该在找到解决方案后执行。为了完整起见,这是您的代码,略作修改的绘图参数可以放大感兴趣的区域:
Clear[d,h,T,f,r,a];
T = 170 Degree;
f[s_, d_] = Normal[Series[Tan[T - (d*s)], {s, 0, 4}]];
r[h_, d_] = Simplify[Integrate[f[s, d], {s, 0, h}]];
a[h_] = Table[r[h, d], {d, 1, 4, .5}];
plot = Plot[a[h], {h, 0, 4}, PlotRange -> {{0, 0.8}, {0, -0.5}},
AspectRatio -> 1, Frame -> {False, True, True, False},
FrameStyle -> Directive[FontSize -> 10],
PlotStyle -> {Thickness[0.004]}]
以下是获得解决方案(h坐标)的代码:
现在制作绘图:
points = ListPlot[MapIndexed[{#1, a[#1][[First@#2]]} &, solutions[[All, 2]]],
PlotStyle -> Directive[PointSize[0.015], Red],
PlotRange -> {{0, 0.8}, {0, -0.5}}, AspectRatio -> 1,
Frame -> {False, True, True, False},
FrameStyle -> Directive[FontSize -> 10]]
最后,结合这些图:
Show[{plot, points}]
编辑:
响应在发现点切割图的请求-以下是一种方法:
plot =
With[{sols = solutions[[All, 2]]},
Plot[Evaluate[a[h]*UnitStep[sols - h]], {h, 0, 4},
PlotRange -> {{0, 0.8}, {0, -0.5}}, AspectRatio -> 1,
Frame -> {False, True, True, False},
FrameStyle -> Directive[FontSize -> 10],
PlotStyle -> {Thickness[0.004]}]]
这应该在找到解决方案后执行。可以通过以下方式找到要点:
slope45s =
h /. Map[First[Solve[D[#, h] == -1 && h >= 0, h]] &, a[h]]
Out[12]={0.623422,0.415615,0.311711,0.249369,0.207807,0.178121\
0.155856}
这里我们列出了相关的要点
pts = Transpose[{slope45s, Tr[a[slope45s], List]}]
现在可以以多种方式绘图。这里有一个这样的例子
p2 = ListPlot[pts, PlotRange -> {{0, 4}, {0, -4}},
PlotStyle -> {PointSize[.01], Red}];
p1 = Plot[a[h], {h, 0, 4}, PlotRange -> {{0, 4}, {0, -4}},
AspectRatio -> 1];
显示[p1,p2]
(作为这个现代世界的新成员——或者更确切地说,是与早期文明相关的时代——我不知道如何在图像中粘贴。)
(好的,谢谢Leonid。我想我有一个图像和缩进代码。)
(但我们为什么要用括号括起来?)
丹尼尔·利奇布劳
钨研究
编辑:我不太喜欢我给你的照片。我认为这里有一个更具描述性
makeSegment[pt_, slope_, len_] :=
Rotate[Line[{pt + {-len/2, 0}, pt + {len/2, 0}}], ArcTan[slope]]
p2 = ListPlot[pts, PlotStyle -> {PointSize[.01], Red}];
p1 = Plot[a[h], {h, 0, 4}, PlotRange -> {{0, 2}, {0, -1}},
AspectRatio -> 1];
p3 = Graphics[Map[{Orange, makeSegment[#, -1, .2]} &, pts]];
Show[p1, p2, p3, AspectRatio -> 1/2, ImageSize -> 1000]
可以通过以下方式找到要点:
slope45s =
h /. Map[First[Solve[D[#, h] == -1 && h >= 0, h]] &, a[h]]
Out[12]={0.623422,0.415615,0.311711,0.249369,0.207807,0.178121\
0.155856}
这里我们列出了相关的要点
pts = Transpose[{slope45s, Tr[a[slope45s], List]}]
现在可以以多种方式绘图。这里有一个这样的例子
p2 = ListPlot[pts, PlotRange -> {{0, 4}, {0, -4}},
PlotStyle -> {PointSize[.01], Red}];
p1 = Plot[a[h], {h, 0, 4}, PlotRange -> {{0, 4}, {0, -4}},
AspectRatio -> 1];
显示[p1,p2]
(作为这个现代世界的新成员——或者更确切地说,是与早期文明相关的时代——我不知道如何在图像中粘贴。)
(好的,谢谢Leonid。我想我有一个图像和缩进代码。)
(但我们为什么要用括号括起来?)
丹尼尔·利奇布劳
钨研究
编辑:我不太喜欢我给你的照片。我认为这里有一个更具描述性
makeSegment[pt_, slope_, len_] :=
Rotate[Line[{pt + {-len/2, 0}, pt + {len/2, 0}}], ArcTan[slope]]
p2 = ListPlot[pts, PlotStyle -> {PointSize[.01], Red}];
p1 = Plot[a[h], {h, 0, 4}, PlotRange -> {{0, 2}, {0, -1}},
AspectRatio -> 1];
p3 = Graphics[Map[{Orange, makeSegment[#, -1, .2]} &, pts]];
Show[p1, p2, p3, AspectRatio -> 1/2, ImageSize -> 1000]
@Daniel Lichtblau:编辑器顶部的图标集中应该有一个图标,用于粘贴图像。但这可能取决于声誉,我不确定。我似乎记得,我最初也不能发布图片。此外,对于代码-如果你想用“代码”字体打印,只需在右边用制表符打4个空格(制表键本身不起作用,所以你必须使用空格)@Daniel似乎你合并了两个版本的代码(或者缺少一些语句)@belisarius抱歉,你是对的(更糟糕的是,我删除了我的笔记本)。临时秘书长名单的编制方式与列奥尼德的《地图索引》相似,但并不优雅。@belisarius我该如何转移选票?“我对这种东西真的很陌生。@丹尼尔,请允许我欢迎您来到StackOverflow,并提醒我们在这里通常会做的三件事:1)当您收到帮助时,尝试给予帮助,回答您专业领域的问题2)3)当您看到好的问题和答案时,向上投票,因为系统的可信度是基于用户通过分享知识而获得的声誉。还记得接受更好地解决你的问题的答案,如果有的话,@Daniel Lichtblau:编辑器顶部的图标集中应该有一个图标,用于粘贴图像。但这可能取决于声誉,我不确定。我似乎记得,我最初也不能发布图片。此外,对于代码-如果你想用“代码”字体打印,只需在右边用制表符打4个空格(制表键本身不起作用,所以你必须使用空格)@Daniel似乎你合并了两个版本的代码(或者缺少一些语句)@belisarius抱歉,你是对的(更糟糕的是,我删除了我的笔记本)。临时秘书长名单的编制方式与列奥尼德的《地图索引》相似,但并不优雅。@belisarius我该如何转移选票?“我对这种东西真的很陌生。@丹尼尔,请允许我欢迎您来到StackOverflow,并提醒我们在这里通常会做的三件事:1)当您收到帮助时,尝试给予帮助,回答您专业领域的问题2)3)当您看到好的问题和答案时,向上投票,因为系统的可信度是基于用户通过分享知识而获得的声誉。还记得接受能更好地解决问题的答案,如果有的话,@Leonid r[]和a[]的定义是用=,而不是:=。可以吗?结果不同。@belisarius:在这种情况下,在IMO中设置是正确的,因为我们希望在定义时而不是运行时进行简化。除了让事情变慢之外,在这里使用SetDelayed还需要在l.h.s.上使用类似于?NumericQ的参数,以避免错误消息。在我们运行代码之前,只需确保没有全局定义d和h。我将添加一个清晰的语句或块,并在一分钟内更新我的帖子。是否有办法将曲线设置为在有问题的点停止?我一直在试图得到一份清单,上面有要评估的终点