1

我正在尝试绘制以下函数并在图上指示函数通过 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]

但我显然不能用这种函数做到这一点,我不知道如何将这些结果添加到图中,以便每条线在它交叉的地方都有一个标记。有谁知道如何设置这个?

4

2 回答 2

5

这是您的代码,为了完整起见,稍微修改了绘图参数以放大感兴趣的区域:

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坐标):

In[42]:= solutions = Map[Reduce[{D[#, h] == -1, h >= 0}, h] &, a[h]]

Out[42]= {h == 0.623422, h == 0.415615, h == 0.311711, h == 0.249369, 
   h == 0.207807, h == 0.178121, h == 0.155856}

现在制作情节:

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]}]]

这应该在找到解决方案后执行。

于 2011-01-26T17:14:32.097 回答
2

可以通过以下方式找到要点:

slope45s = 
 h /. Map[First[Solve[D[#, h] == -1 && h >= 0, h]] &, a[h]]

输出[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。我想我有一张图片和缩进的代码。)

(但为什么我们在括号里说话??)

在此处输入图像描述 Daniel Lichtblau Wolfram 研究

编辑:我不太喜欢我给的照片。这是我认为更具描述性的一个。

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]

在此处输入图像描述

于 2011-01-26T17:26:04.763 回答