Convex hull didefenisikan sebagai sutau objek di mana garis yang menghubungkan titik-titik di dalam objek tersebut juga berada di dalam objek tersebut. Untuk menentukan convex hull dari kumpulan titik, terdapat beberapa algoritma yang digunakan, salah satunya adalah monotone chain. Animasinya dapat dilihat pada video berikut
Sementara kode untuk menggenerate-nya di javaFX dapat dilihat pada
https://gist.github.com/gunungloli666/8859178
Sesungguhnya shalat itu mencegah dari (perbuatan-perbuatan) keji dan mungkar
Q.S. Al-'Ankabut Ayat 45
Saturday, February 8, 2014
Thursday, January 30, 2014
Trammel Archimedes di JavaFX
Berikut ini saya berikan contoh animasi javaFX yakni dalam membuat trammel Archimedes.
Adapun source code nya adalah
Adapun source code nya adalah
package fjr.ellipse; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; import javafx.stage.Stage; import javafx.util.Duration; // @author moh_fajar // @date: 31-1-2014 public class EllipseExp extends Application { public static void main(String[] args) { launch(args); } Timeline animation; GraphicsContext gc; Canvas canvas; Trammel tr ; double angle; double canvasWidth = 450 , canvasHeight = 350 ; @Override public void start(Stage primaryStage) throws Exception { Group root = new Group(); Group child = new Group(); primaryStage.setScene(new Scene(root,500, 500)); angle = 45; tr = new Trammel(200, 150 , 100, 60, angle); canvas = new Canvas(canvasWidth, canvasHeight); gc = canvas.getGraphicsContext2D(); root.getChildren().add(child); child.getChildren().addAll(canvas); animation = new Timeline(); animation.getKeyFrames().addAll( new KeyFrame(Duration.millis(10), new EventHandler() { @Override public void handle(ActionEvent arg0) { angle-= Math.PI/200 ; tr.setAngle(angle); tr.calculatePosition(); draw(gc); } })); primaryStage.show(); animation.setCycleCount(Timeline.INDEFINITE); animation.setAutoReverse(false); animation.play(); } void draw(GraphicsContext gc){ gc.setFill(Color.WHITE); gc.fillRect(0, 0, canvasWidth, canvasHeight); gc.setStroke(Color.BLACK); gc.strokeRect(0, 0, canvasWidth, canvasHeight); gc.setFill(Color.RED); gc.fillRect(tr.x, tr.y, 5, 5); gc.setFill(Color.BLUE); gc.fillRect(tr.x1, tr.y1, 5, 5); gc.setFill(Color.GREENYELLOW); gc.fillRect(tr.x2, tr.y2, 5, 5); gc.setStroke(Color.RED); gc.strokeLine(tr.x, tr.y, tr.x2, tr.y2); gc.setStroke(Color.BLACK); gc.strokeLine(tr.x2, tr.y1 - 110 , tr.x2, tr.y1 + 110); gc.strokeLine(tr.x2- 200, tr.y1 , tr.x2 + 200, tr.y1 ); gc.setStroke(Color.BLACK); gc.strokeOval(tr.getXCorrection() - tr.getA(), tr.getYCorrection() - tr.getB(), 2 * tr.getA() , 2 * tr.getB()); } class Trammel { double angle; double p, q; public double x, y; // posisi dari rod public double x1, y1 ; // posisi dari pivot 1 public double x2, y2 ; // posisi dari pivot 2 double xCorrection; double yCorrection; /* * Dalam Trammel Archimedes, terdapat dua titik pivot yakni A dan B. * Sementara yang men-trace elipse adalah titik C pada ujung trammel. * Jarak A ke B adalah p, sementara jarak B ke C adalah q, dengan * demikian lintasan titik C ditentukan oleh x = (p + q) cos \theta y = * q sin theta. lihat: http://en.wikipedia.org/wiki/Trammel_of_Archimedes */ public Trammel(double x, double y, double p, double q, double angle) { this.xCorrection = x; this.yCorrection = y; this.p = p; this.q = q; this.angle = angle; } public void setAngle(double angle) { this.angle = angle; } public void calculatePosition() { x = xCorrection+ (p + q) * Math.cos(angle); y = yCorrection + (q) * Math.sin(angle); x1 = x - q * Math.cos(angle); y1 = y - q * Math.sin(angle); x2 = x1 - p * Math.cos(angle); y2 = y1 - p * Math.sin(angle); } public double getA(){return (p+q);} public double getB(){return q ;} public double getXCorrection() {return xCorrection;} public double getYCorrection() {return yCorrection; } } }
Sunday, January 19, 2014
Mengganti access modifier (tipe variabel: private, protected, final menjadi public) di Java
Berikut ini saya berikan contoh kegunaan Reflection di java. Yakni untuk mengganti tipe access modifier. Misalnya kita mempunyai kelas yang field-nya dibuat private, maka kita dapat menggunakan reflection untuk membuatnya jadi public. Perhatikan contoh berikut
Kita dapat merubah nilai field name yang private sekaligus final dalam kelas tersebut dengan bantuan reflection di Java. Perhatikan contoh berikut
Hasil eksekusinya adalah:
Kita dapat merubah nilai field name yang private sekaligus final dalam kelas tersebut dengan bantuan reflection di Java. Perhatikan contoh berikut
Hasil eksekusinya adalah:
Menggunakan generic untuk conversi list di Java
Salah satu dari kegunaan generic di java adalah untuk mengkonversi list objek tipe tertentu menjadi list objek tipe turunannya. Jika kita ingin mengkonversi list yang berisi objek tipe A menjadi list objek tipe B (yang mengekstends A), itu tidak bisa dilakukan secara langsung, seperti contoh berikut
Pada contoh di atas method convert tersebut tidak bisa dituliskan seperti itu, walaupun kelas B mengekstends kelas A. Yang harus dilakukan adalah dengan menggunakan generic seperti potongan berikut
Dan itupun hanya berlaku jika kelas B mengekstends kelas A. Jika tidak akan terjadi error misalnya:
Yang akan menghasilkan output
Pada contoh di atas method convert tersebut tidak bisa dituliskan seperti itu, walaupun kelas B mengekstends kelas A. Yang harus dilakukan adalah dengan menggunakan generic seperti potongan berikut
Dan itupun hanya berlaku jika kelas B mengekstends kelas A. Jika tidak akan terjadi error misalnya:
Yang akan menghasilkan output
Wednesday, January 8, 2014
Menyimpan gambar di canvas ke file di javaFX
Berikut ini saya berikan contoh bagaimana menyimpan hasil penggambaran free-form kita dalam javaFx canvas ke dalam file.
package fjr.test.testIO; import java.io.File; import javafx.application.Application; import javafx.embed.swing.SwingFXUtils; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.*; import javafx.scene.image.*; import javafx.scene.input.MouseEvent; import javafx.scene.layout.HBox; import javafx.stage.*; import javax.imageio.ImageIO; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.Button; import javafx.scene.paint.Color; public class PrintCanvas extends Application { GraphicsContext gc; Canvas canvas; double canvaswidth = 300 , canvasheight = 350 ; @Override public void start(Stage primaryStage) { Group root = new Group(); Scene scene = new Scene(root, 400, 450); canvas = new Canvas(canvaswidth, canvasheight); canvas.setTranslateX(10); canvas.setTranslateY(50); gc = canvas.getGraphicsContext2D(); gc.setLineWidth(23); gc.setFill(Color.GREEN); gc.setStroke(Color.BLUE); gc.setLineWidth(6); gc.strokeRect(0, 0, canvaswidth, canvasheight); gc.setStroke(Color.BLACK); final WritableImage wim = new WritableImage((int)canvaswidth, (int)canvasheight); root.getChildren().add(canvas); primaryStage.setScene(scene); primaryStage.show(); final Button simpan = new Button(); simpan.setTranslateX(10); simpan.setTranslateY(10); simpan.setPrefSize(100, 30); simpan.setText("SIMPAN"); simpan.setOnAction(new EventHandlerHasilnya adalah() { @Override public void handle(ActionEvent arg0) { canvas.snapshot(null, wim); File file = new File("E:/CanvasImage.png"); try { ImageIO.write(SwingFXUtils.fromFXImage(wim, null), "png", file); System.out.println("File sudah disimpan"); } catch (Exception s) { } } }); root.getChildren().add(new HBox(){{ getChildren().add(simpan); }}); canvas.addEventHandler(MouseEvent.MOUSE_DRAGGED, new EventHandler () { @Override public void handle(MouseEvent e) { gc.lineTo(e.getX(), e.getY()); gc.stroke(); } }); canvas.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler () { @Override public void handle(MouseEvent e) { gc.beginPath(); gc.moveTo(e.getX(), e.getY()); gc.stroke(); } }); } public static void main(String[] args) { launch(args); } }
Tuesday, January 7, 2014
Cara menggabungkan javaFX dengan java Swing
Tanpa perlu berbasa-basi berikut saya berikan contoh menggabungkan teknologi javaFX dengan java Swing. Berdasarkan informasi yang saya peroleh javaFX mungkin kedepannya dipake untuk menggantikan Swing.
package fjr.test.javafxpanel; import java.awt.Dimension; import javafx.animation.Animation; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Platform; import javafx.embed.swing.JFXPanel; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.chart.LineChart; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.scene.control.Button; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.util.Duration; import javax.swing.JFrame; import javax.swing.SwingUtilities; public class TestJavaFXPanel { private XYChart.SeriesPotongan hasil eksekusinya adalah sebagai berikuthourDataSeries; private XYChart.Series minuteDataSeries; private NumberAxis xAxis; private Timeline animation; private double hours = 0; private double minutes = 0; private double timeInHours = 0; private double prevY = 10; private double y = 10; public TestJavaFXPanel() { initAndShowGUI(); } private void initAndShowGUI() { JFrame frame = new JFrame("Test Swing"); frame.setPreferredSize(new Dimension(600, 400)); frame.pack(); final JFXPanel fxPanel = new JFXPanel(); frame.add(fxPanel); frame.setVisible(true); Platform.runLater(new Runnable() { @Override public void run() { initFX(fxPanel); } }); } private void initFX(JFXPanel fxPanel) { Scene scene = createScene(); fxPanel.setScene(scene); animation = new Timeline(); animation.getKeyFrames().add(new KeyFrame(Duration.millis(1000/60), new EventHandler () { @Override public void handle(ActionEvent actionEvent) { for(int count=0; count < 6; count++) { nextTime(); plotTime(); } } })); animation.setCycleCount(Animation.INDEFINITE); } private Scene createScene() { StackPane root = new StackPane(){{ setTranslateX(0); setTranslateY(0); }}; Button button = new Button("PLAY"){{ setMinSize(100, 30); setOnAction(new EventHandler () { @Override public void handle(ActionEvent arg0) { play(); } }); }}; Button button2 = new Button("STOP"){{ setMinSize(100, 30); setOnAction(new EventHandler () { @Override public void handle(ActionEvent arg0) { // TODO Auto-generated method stub stop(); } } ); }}; HBox box = new HBox(){{ setSpacing(10); setTranslateX(10); setTranslateY(10); }}; box.getChildren().addAll(button, button2); root.getChildren().addAll( new BorderPane(){{ setLeft(createChart()); }} , box); Scene sc = new Scene(root); return sc; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new TestJavaFXPanel(); } }); } protected LineChart createChart() { xAxis = new NumberAxis(0,24,3); final NumberAxis yAxis = new NumberAxis(0,100,10); final LineChart lc = new LineChart (xAxis,yAxis); lc.setCreateSymbols(false); lc.setAnimated(false); lc.setLegendVisible(false); lc.setTitle("PLOT GRAFIK"); xAxis.setForceZeroInRange(false); yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis,"$",null)); hourDataSeries = new XYChart.Series (); minuteDataSeries = new XYChart.Series (); hourDataSeries.getData().add(new XYChart.Data (timeInHours,prevY)); minuteDataSeries.getData().add(new XYChart.Data (timeInHours,prevY)); for (double m=0; m<(60); m++) { nextTime(); plotTime(); } lc.getData().add(minuteDataSeries); lc.getData().add(hourDataSeries); lc.setTranslateX(10); lc.setTranslateY(40); lc.setMaxWidth(400); lc.setMaxHeight(330); return lc; } private void nextTime() { if (minutes == 59) { hours ++; minutes = 0; } else { minutes ++; } timeInHours = hours + ((1d/60d)*minutes); } private void plotTime() { if ((timeInHours % 1) == 0) { double oldY = y; y = prevY - 10 + (Math.random()*20); prevY = oldY; while (y < 10 || y > 90) y = y - 10 + (Math.random()*20); hourDataSeries.getData().add(new XYChart.Data (timeInHours, prevY)); if (timeInHours > 25) hourDataSeries.getData().remove(0); if (timeInHours > 24) { xAxis.setLowerBound(xAxis.getLowerBound()+1); xAxis.setUpperBound(xAxis.getUpperBound()+1); } } double min = (timeInHours % 1); double randomPickVariance = Math.random(); if (randomPickVariance < 0.3) { double minY = prevY + ((y-prevY) * min) - 4 + (Math.random()*8); minuteDataSeries.getData().add(new XYChart.Data (timeInHours,minY)); } else if (randomPickVariance < 0.7) { double minY = prevY + ((y-prevY) * min) - 6 + (Math.random()*12); minuteDataSeries.getData().add(new XYChart.Data (timeInHours,minY)); } else if (randomPickVariance < 0.95) { double minY = prevY + ((y-prevY) * min) - 10 + (Math.random()*20); minuteDataSeries.getData().add(new XYChart.Data (timeInHours,minY)); } else { double minY = prevY + ((y-prevY) * min) - 15 + (Math.random()*30); minuteDataSeries.getData().add(new XYChart.Data (timeInHours,minY)); } if (timeInHours > 25) minuteDataSeries.getData().remove(0); } public void play() { animation.play(); } public void stop() { animation.pause(); } }
Saturday, January 4, 2014
Menggunakan radio button dengan benar di JavaFX
Berikut ini adalah contoh source cara menggunakan radio button yang benar di JavaFX:
package fjr.test.toggle; import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.RadioButton; import javafx.scene.control.Toggle; import javafx.scene.control.ToggleGroup; import javafx.scene.layout.HBox; import javafx.stage.Stage; public class TestToggleA extends Application { static enum Cuaca{ CERAH , BERAWAN } Cuaca cuaca_now = Cuaca.CERAH; public static void main(String[] args){ Application.launch(args); } ToggleGroup groupToggle ; RadioButton radio1 , radio2 ; @Override public void start(Stage stage) throws Exception { Group root = new Group(); groupToggle = new ToggleGroup(); HBox box = new HBox(){{ setTranslateX(30); setTranslateY(30); setSpacing(10); getChildren().addAll( radio1 = new RadioButton("BERSINAR"){{ setToggleGroup(groupToggle); setUserData(Cuaca.CERAH); }}, radio2 = new RadioButton("GELAP"){{ setToggleGroup(groupToggle); setUserData(Cuaca.BERAWAN); }}); }}; switch(cuaca_now){ case CERAH: radio1.setSelected(true); break; case BERAWAN: radio2.setSelected(true); break; } root.getChildren().add(box); stage.setScene(new Scene(root, 200,200)); stage.show(); System.out.println("Type cuaca saat inisialisasi: "+ cuaca_now); groupToggle.selectedToggleProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue arg0, Toggle arg1, Toggle toggle) { // TODO Auto-generated method stub RadioButton radio = (RadioButton) toggle; Cuaca c = (Cuaca) radio.getUserData(); cuaca_now = c; System.out.println("Type cuaca saat pergantian button: "+cuaca_now); } }); } }
Monday, December 30, 2013
Cara menggunakan latex di libre office
Dalam tulisan kali ini, saya akan mencoba menjelaskan sedikit mengenai bagaimana cara menambahkan kode latex ke dalam libre office. Mengapa latex, adalah karena di samping sudah merupakan sebuah standar dalam penulisan dokument, Latex juga memberikan sedikit fleksibilitas dalam penulisan rumus (formula) ke dalam dokument. Dalam artian ada banyak simbol-simbol dan teknik penulisan persamaan yang ada di Latex yang mungkin tidak dijumpai dalam sistem pemrosesan dokumen model lain.
Untuk keperluan itu, kita terlebih dahulu harus menggunakan sebuah addons yakni texmath, yang bisa di download di:
http://extensions.libreoffice.org/extension-center/texmaths-1
Untuk bisa menggunakannya, kita harus pastikan bahwa di komputer kita sudah terinstall miktex atau kompiler Latex yang lain. Kalo Sudah tinggal kita install dan konfigurasi agar libre office mengenali miktex pada komputer kita.
Untuk menginstall, gampang aja, yakni klik: menu->extension manager->add->pilih lokasi installer texmath
Jika sudah terinstall, restart dulu libre office, akan muncul icon seperti gambar berikut
Sekarang klik icon ketiga pada gambar tersebut, untuk melakukan konfigurasi agar libre office tahu di mana miktex (kompiler Latex) berada:
Dalam gambar tersebut, kita hanya perlu mengisi dua buah kotak, kotak ketiga hanya pilihan, sementara kotak yang paling atas wajib di isi karena merupakan lokasi bagi latex kompiler. Biasanya kalo miktex sudah terinstall (bukan portable), texmath akan dengan sendirinya mengenali lokasinya, namun karena kebetulan saya menggunakan miktex portable, maka harus dilakukan konfigurasi manual ketiga kotak tersebuut.
Selanjutnya kita tinggal klik icon berbentuk pi untuk memasukkan persamaan ke dalam dokument kita.
Lantas klik tombol Latex:
Untuk persamaan yang diberi nomor klik icon berbentuk pi yang di tengah (yang lebih kecil dengan tambahan angka 1 dalam kurung siku).
Selanjutnya kita bisa mengatur beberapa hal menyangkut resolusi persamaan dalam dokument kita beserta transparansinya. Yakni dengan mengklik kotak preference
Bagusnya kita jangan menggunakan transparansi, karena ketika persamaannya diletakkan dalam sebuah diagram, transparansi akan menyulitkan kita dalam memindah-mindahkan persamaannya. Namun ada kalanya kita meletakkan sebuah persamaan di atas sebuah kotak atau diagram yang berwarna sehingga jika tidak diberi transparansi akan kurang bagus seperti pada gambar berikut
Oleh karena itu kita harus mengatur preamble pada kode Latex yakni dengan mengklik kotak preamble
Yang perlu dilakukan adalah menghilangkan tanda comment (%) dari kode tersebut, lantas menset nilai fgcolor dan bgcolor sesuai dengan nilai warna (dalam RGB) dari kotak/diagram yang akan ditempati oleh persamaan tersebut. Untuk mengetahui nilai warna tersebut. fgcolor menyatakan warna text sementara bgcolor menyatakan warna latar belakang. Secara default nilai fgcolor adalah (0,0, 255) atau hitam, sementara bgcolor adalah (255,255,255) atau putih. Untuk mengetahui nilai RGB dari diagram kita caranya adalah klik kanan pada area diagram lantas pilih menu area->color:
SELAMAT MENCOBA.....
Untuk keperluan itu, kita terlebih dahulu harus menggunakan sebuah addons yakni texmath, yang bisa di download di:
http://extensions.libreoffice.org/extension-center/texmaths-1
Untuk bisa menggunakannya, kita harus pastikan bahwa di komputer kita sudah terinstall miktex atau kompiler Latex yang lain. Kalo Sudah tinggal kita install dan konfigurasi agar libre office mengenali miktex pada komputer kita.
Untuk menginstall, gampang aja, yakni klik: menu->extension manager->add->pilih lokasi installer texmath
Jika sudah terinstall, restart dulu libre office, akan muncul icon seperti gambar berikut
Sekarang klik icon ketiga pada gambar tersebut, untuk melakukan konfigurasi agar libre office tahu di mana miktex (kompiler Latex) berada:
Dalam gambar tersebut, kita hanya perlu mengisi dua buah kotak, kotak ketiga hanya pilihan, sementara kotak yang paling atas wajib di isi karena merupakan lokasi bagi latex kompiler. Biasanya kalo miktex sudah terinstall (bukan portable), texmath akan dengan sendirinya mengenali lokasinya, namun karena kebetulan saya menggunakan miktex portable, maka harus dilakukan konfigurasi manual ketiga kotak tersebuut.
Selanjutnya kita tinggal klik icon berbentuk pi untuk memasukkan persamaan ke dalam dokument kita.
Lantas klik tombol Latex:
Untuk persamaan yang diberi nomor klik icon berbentuk pi yang di tengah (yang lebih kecil dengan tambahan angka 1 dalam kurung siku).
Selanjutnya kita bisa mengatur beberapa hal menyangkut resolusi persamaan dalam dokument kita beserta transparansinya. Yakni dengan mengklik kotak preference
Bagusnya kita jangan menggunakan transparansi, karena ketika persamaannya diletakkan dalam sebuah diagram, transparansi akan menyulitkan kita dalam memindah-mindahkan persamaannya. Namun ada kalanya kita meletakkan sebuah persamaan di atas sebuah kotak atau diagram yang berwarna sehingga jika tidak diberi transparansi akan kurang bagus seperti pada gambar berikut
Oleh karena itu kita harus mengatur preamble pada kode Latex yakni dengan mengklik kotak preamble
Yang perlu dilakukan adalah menghilangkan tanda comment (%) dari kode tersebut, lantas menset nilai fgcolor dan bgcolor sesuai dengan nilai warna (dalam RGB) dari kotak/diagram yang akan ditempati oleh persamaan tersebut. Untuk mengetahui nilai warna tersebut. fgcolor menyatakan warna text sementara bgcolor menyatakan warna latar belakang. Secara default nilai fgcolor adalah (0,0, 255) atau hitam, sementara bgcolor adalah (255,255,255) atau putih. Untuk mengetahui nilai RGB dari diagram kita caranya adalah klik kanan pada area diagram lantas pilih menu area->color:
SELAMAT MENCOBA.....
Friday, December 20, 2013
Menghitung bobot dan node pada Gauss Quadrature
Untuk menghitung integral berhingga dengan Gauss-Quadrature sebenarnya agak-agak rumit. Karena kita harus menempuh beberapa metode yang agak ruwet dan tidak mudah. Harus menyelesaikan sistem persamaan Linear dan lain-lain manipulasi aljabar yang membingungkan. Karena kita harus menghitung bobot dan node yang tergantung berapa nodenya. Tapi saya menemukan suatu source code di internet yang sudah menyelesaikan persoalan tersebut. Yakni
Anda bisa mengkonfirmasi di buku nilai-nilai di atas.
Kebetulan dasar teorinya agak ribet, tapi saya menemukan salah satunya di internet juga yakni sebuah tesis magister. Yang bisa anda download di:
https://drive.google.com/file/d/0B1irLqfPwjq0RFhHQVpvaUVuWlk/edit?usp=sharing
function [x,w]=lgwt(N,a,b) % lgwt.m % % This script is for computing definite integrals using Legendre-Gauss % Quadrature. Computes the Legendre-Gauss nodes and weights on an interval % [a,b] with truncation order N % % Suppose you have a continuous function f(x) which is defined on [a,b] % which you can evaluate at any x in [a,b]. Simply evaluate it at all of % the values contained in the x vector to obtain a vector f. Then compute % the definite integral using sum(f.*w); % % Written by Greg von Winckel - 02/25/2004 N=N-1; N1=N+1; N2=N+2; xu=linspace(-1,1,N1)'; % Initial guess y=cos((2*(0:N)'+1)*pi/(2*N+2))+(0.27/N1)*sin(pi*xu*N/N2); % Legendre-Gauss Vandermonde Matrix L=zeros(N1,N2); % Derivative of LGVM Lp=zeros(N1,N2); % Compute the zeros of the N+1 Legendre Polynomial % using the recursion relation and the Newton-Raphson method y0=2; % Iterate until new points are uniformly within epsilon of old points while max(abs(y-y0))>eps L(:,1)=1; Lp(:,1)=0; L(:,2)=y; Lp(:,2)=1; for k=2:N1 L(:,k+1)=( (2*k-1)*y.*L(:,k)-(k-1)*L(:,k-1) )/k; end Lp=(N2)*( L(:,N1)-y.*L(:,N2) )./(1-y.^2); y0=y; y=y0-L(:,N2)./Lp; end % Linear map from[-1,1] to [a,b] x=(a*(1-y)+b*(1+y))/2; % Compute the weights w=(b-a)./((1-y.^2).*Lp.^2)*(N2/N1)^2;Di mana versi python-nya adalah:
import numpy as np np.set_printoptions(precision=4) # fungsi untuk menghitung node-node pada gauss-quadrature def lgwt(N, a , b): N = N -1 N1 , N2= N + 1, N+2 xu = np.linspace(-1,1, N1) y = np.cos(( 2* np.transpose(np.arange(0,N+1)) + 1 )\ * np.pi / (2 * N + 2)) + (0.27 / N1 ) * np.sin(np.pi * xu * N / N2) ; L = np.zeros([N1, N2]) y0 = 2 while np.max(np.abs(y - y0 )) > spacing(1): L[:,0] = 1 L[:,1] = y for k in range(1, N1): L[:,k+1] = ((2*(k+1)-1)*y *L[:,k]-(k)*L[:,k-1])/(k+1) Lp=(N2)*(L[:,N1-1]-y * L[:,N2-1])/(1-np.power(y,2)) y0 = y y = y0 - L[:, N2-1] / Lp N2 = float(N2) N1 = float(N1) x = (a*(1-y ) + b * (1+ y) ) / 2 w = (b-a) / ((1 - np.power(y ,2 ) ) * np.power(Lp, 2) ) \ * np.power(N2/N1 , 2) return (x, w) (a , b ) = lgwt(12,-5,5) # untuk ngetes print a print bPotongan eksekusinya adalah
Anda bisa mengkonfirmasi di buku nilai-nilai di atas.
Kebetulan dasar teorinya agak ribet, tapi saya menemukan salah satunya di internet juga yakni sebuah tesis magister. Yang bisa anda download di:
https://drive.google.com/file/d/0B1irLqfPwjq0RFhHQVpvaUVuWlk/edit?usp=sharing
Thursday, December 19, 2013
Maksud perintah eval di MATLAB
Berikut ini saya berikan contoh penggunaan perintah eval di MATLAB. Silakan dites di komputer anda... kebetulan saya g bisa buat video demonya lantaran koneksi lambat :D.
sayang = ['clc;',... 'f = figure;', ... 'x = linspace(-pi,pi,100 );', ... 'y = sin(x);',... 'maju = 1;',... 'm = 1;',... 'n = 1;',... 'while ishandle(f)',... 'for i=1:length(x)',... 'p = plot(x(1:i),y(1:i), ''linewidth'', 3);'... 'hold on;'... 'p1 = plot(x(i), y(i),''r.'' , ''markersize'', 30);'... 'axis([-pi pi -1 1]);'... 'pause(0.01);',... 'if ishandle(p), delete(p); end,'... 'if ishandle(p1),delete(p1); end,'... 'end,',... 'for i=length(x):-1:1',... 'p = plot(x(i:length(x)),y((i:length(y))), ''linewidth'', 3);',... 'p1 = plot(x(i), y(i),''r.'' , ''markersize'', 30);'... 'axis([-pi pi -1 1]);'... 'pause(0.01);',... 'if ishandle(p), delete(p); end,',... 'if ishandle(p1),delete(p1); end,'... 'end,',... 'end']; eval(sayang);
Subscribe to:
Posts (Atom)