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

ここに画像の説明を入力してください

編集:

見つかったポイントでプロットをカットするという要求に応答する-ここに1つの方法があります:

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

Out [12] = {0.623422、0.415615、0.311711、0.249369、0.207807、0.178121、\ 0.155856}

ここでは、関連するポイントのリストをまとめました。

pts = Transpose[{slope45s, Tr[a[slope45s], List]}]

さまざまな方法でプロットできるようになりました。これがそのようなものの1つです。

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]

ここに画像の説明を入力してください

于 2011-01-26T17:26:04.763 に答える