2011-09-07 10 views
5

İstediğimi yapmak için sözdizimini alamıyorum ve şimdi bile mümkün olup olmadığından emin değilim., Manipulate içindeki kontrol değişkenlerini ayarlamak için Dynamic'in ikinci argümanını kullanmak mümkün mü?

küçük inceleme: bir yapabilir: hemen her zaman

{Slider[Dynamic[b], {-2 Pi, 2 Pi}], Dynamic[Sin[b]]} 

ve sürgü hareket ettikçe, 'b' değişiklikler ve Sin [] otomatik olarak yazdırılır

enter image description here

Ama hesaplamayı (Sin []) doğrudan kaydın olduğu ve sadece Sin'in [Nihai] sonucunu gösterdiği yerde yapmak istediğimi varsayalım, o zaman bu gibi Dinamik'in ikinci argümanını kullanabilirim:

{Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {-2 Pi, 2 Pi}], 
Dynamic[a]} 

enter image description here

Şimdi işleyin kullanın ve aynı şeyi yapmak istiyorum. Yukarıda ise

Manipulate[ 
Sin[b], 
Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}] 
] 

enter image description here

işleyin 'dinamik' şeyler hallettim ve güncellenmiş Sin [b] her 'B' değişiklikler: Böyle yukarıdaki ilk örnekle aynı yapabilir .

Şimdi, ben işleyin kullanarak ikinci durumda yapabileceğini görmek istiyorum, bu yüzden yazabilirsiniz:

Manipulate[ 
a, 
Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}] (*where to insert Sin[b]?*) 
] 

('a' ilk gösterimi için bazı değerine başlatılan zorundadır).

Ancak, yukarıdaki "b" için ikinci bağımsız değişkeni nasıl kullanacağımı anlayamıyorum. Sözdizimini anlayamıyorum ve şimdi mümkün olursa emin misiniz?

elbette, biri sadece bu kontrolleri işleyin bile geçerli sözdizimi değil

Manipulate[ 
a, 
{Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {-2 Pi, 2 Pi}]} 
] 

yazamazsınız.

Soru: Manipulate denetimlerini ayarlamada Dynamic'in ikinci argümanını kullanmak mümkün mü?

Sormamın nedeni, kontrol değişkeninin değiştiği yerde hesaplamayı 'yerelleştirmeyi' kolaylaştırabilmesi ve yalnızca başka bir yerde yalnızca nihai sonucu göstermesidir. Yerel bir geriçağırım işlevi gibi, her bir kontrolün değişmesiyle ilgili hesaplamanın, kontrolün hemen yanında yer alması gibi.

sayesinde

Güncelleme 9/16/11

Eh, mücadelenin bir ay sonra, nihayet ben Mathematica CDF'yi kuruldu ve çalışıyor.

Bu CDF'yi (Leonid, Heike, WReach, Belisarius ve diğerleri) yaparken, Simon ve diğer sorularıma yanıt veren diğer kişiler tarafından gösterilen hile yardımıyla.

Burada öğrendiğim birkaç hile burada, bu gösteri bitirmek yardımcı birisi bunu denemek istiyorsa link olduğunu.

enter image description here

bu CDF'nin tasarımı daha önce yaptıklarımdan farklı. Sonlu durum makinesine dayanmaktadır. Tüm CDF'de sadece bir tane izlenen sembol var. İkinci dinamik argümanını kullanarak, olay isminin kaydı ve sonlu durum makinelerini çalıştıran Manipulate'nin ana ifadesinde, içinde bulunabileceği 5 durum vardır ve 8 olay vardır. Mevcut duruma ve gerçekleşen mevcut duruma bağlı olarak, yeni duruma geçer (veya bağlı olarak aynı durumda kalabilir) ve ana ekran güncellenir. Tetik gerekmiyor. Durum makinesi, izin verdiğiniz kadar hızlı çalışır, yalnızca zaman adımı büyüklüğünde kontrol edilir. Her şey şimdi iyi kontrollü bir şekilde çalışır ve tüm mantık tek bir yerde olduğundan,

Bu büyük ölçüde mantık basitleştirir ve çok daha gelişmiş UI ve birbirine bağlı mantık yapmak işlemek mümkün kılar. dinamiklerinin ikinci argümanı kullanarak olayı ayarlamak mümkün olan vermeden

, bütün bu yaklaşım mümkün olmazdı.

bunu daha net hale getirmek için bu yöntem üzerinde bir not yazmak gerekir.

Yani, sadece burada herkese teşekkür etmek istedim. Şimdi bu yöntemi kullanarak üçlü bir sarkaç simülasyonu ile başka bir CDF bitiriyorum.

+0

Vay, son sonuç gerçekten güzel görünüyor! Makinemde yavaş çalışır, ama çoğu şey yapar ... Tarayıcı eklentisini kullanamayanlar için bir indirme bağlantısı sağlayabilseydin çok hoş olurdu. – Simon

+1

@Simon, CDF ve dizüstü bilgisayarın kendisi için 2 link ekledim. http://12000.org/my_notes/mma_demos/simple_pendulum_damped_driven/index.htm olabildiğince hızlı çalışır, izlenen Dinamik dışında bir saat yoktur. – Nasser

+0

Şimdi 'yavaşlık' konusunda daha iyi bir fikrim var. Daha fazla şey görüntülendiğinde, ekrana yapılan güncelleme daha fazla zaman almaya başlar ve ekranın her seferinde boyanması için bekleyen tüm döngü yavaşlar. CDF demoları ile daha yüksek fps almak benim için bir sorun oldu. Bunu daha verimli hale getirmek için hileler olup olmadığını bilmiyorum. Ama kesinlikle buna bağlı gibi görünüyor. Görüntülenecek grafik/grafik sayısını azalttığımda, simülasyon daha hızlı çalışır. Hiçbir saat kullanılmaz, sadece içindeki [Grafik [..]] ile bir döngü. Son bitirdiğim CDF bu sorunu çok net bir şekilde gösterdi. – Nasser

cevap

7

ilkinden sonra Manipulate argümanlar Tüm Control nesneler olmak zorunda. Tamamen özelleştirilmiş dinamik kontroller de dahil olmak üzere istediğiniz her şeyi koyabilirsiniz. Peki, nasıl

Manipulate[a, {a, None}, {b, None}, 
Row[{"b= ",Slider[Dynamic[b, (b = #; a = Sin[b]; #)&], {-2 Pi, 2 Pi}]}]] 

gibi bir şey nereden {a, None} ve {b, None} değişkenler yerel, ama mutlaka bulunması emin olun.

+0

Güzel numara Simon! Bu yeni olasılıklar açar :). Btw, yukarıdaki satırdan önce Dinamik'i neden eklediğini bilmiyorum. Bu, şu şekilde çalışır: Satır [{"b =", Kaydırıcı [Dinamik [b, (b = #; a = Sin [b]; #) &], {-2 Pi, 2 Pi}]} ], ekstra Dinamik gerekli görünmüyor. Tekrar teşekkürler! – Nasser

+0

@Nasser: Teşekkürler, ben bu yabancı 'Dynamic' kaldırdım. – Simon

+0

Bu yöntemi deniyorum ve çok iyi çalışıyor. Mantığı çok basitleştirdim. Şimdi, Manipulate ifadesinde bir durum makinem var ve herhangi bir denetim kolayca değiştiğinde durumu değiştirebilirim. Bir kontrolün ne zaman değiştiğini algılamak için, her kontrolün ya da kontrol setinin her yerinde karmaşık Dinamik/Yenile kodu kullanmadan önce. Ama şimdi ana Manipulate İfadesinde Dinamik [Refresh [..]] 'i kullanmadan sadece şu andaki durumu kolayca değiştirebiliyorum.Manipulate ana ifadesinde Hangi [] öğesini kullanarak, hangi durumda olduğumu her zaman bilirim. – Nasser

İlgili konular