Plot 在mathematica中,如何求解函数的正根并将其作为函数图上的点绘制?

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 -> {

我试图绘制以下函数,并在图上指出函数通过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 -> {{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。我将添加一个清晰的语句或块,并在一分钟内更新我的帖子。是否有办法将曲线设置为在有问题的点停止?我一直在试图得到一份清单,上面有要评估的终点