2011-01-26 107 views
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] 

但我顯然不能與這種功能做到這一點,我不知道如何將這些結果添加到情節使每一行得到一個標誌它橫渡。有誰知道如何設置?

回答

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][[[email protected]#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}] 

enter image description here

編輯:

響應在發現點切割地塊的要求 - 在這裏是一種方法:

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

,這應該在解決方案後執行已被發現。

+0

@Leonid R的定義[]和a []與** = **完成的,而不是**:= **。這可以嗎?結果不同.. – 2011-01-26 18:22:11

+0

@belisarius:在這種情況下,Set是做IMO的正確的事情,因爲我們想在定義的時候做簡化,而不是在運行時。除了讓事情變慢之外,在這裏使用SetDelayed需要我們在l.hs.s上使用_?NumericQ之類的東西。爲參數,以避免錯誤消息。我們必須確保在運行代碼之前d和h沒有被全局定義。我將添加一個Clear語句或Block,將在一分鐘內更新我的帖子。 – 2011-01-26 18:34:04

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]

(作爲新的這個現代化的天下 - 或者更確切地說,一個時代與早期civilization--我不知道如何將圖像粘貼在相關。 )

(好吧,感謝獅子座。我想我有一個形象,也縮進代碼。)

(但是爲什麼我們在括號說話?)

enter image description here 丹尼爾Lichtblau 沃爾夫勒姆研究

編輯:我不太喜歡我給的圖片。這裏是我認爲更具描述性的一個。

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] 

enter image description here