import fi.jyu.mit.ohj2.*; import java.util.List; /** * Ohjelmalla integroidaan numeerisesti funktio-olio. * @author Vesa Lappalainen * @version 1.0, 25.03.2003 * @version 1.1, 06.05.2005 * Muutettu: * - Lisätty esimerkki funktioiden yhdistämisestä ja luonnista * nimettömillä sisäluokilla ja map-funktiosta. Miika Nurminen, 06.05.2005 * * Tehtäviä: * - toteuta numeerinen derivaattafunktion muodostinmetodi * - toteuta funktio polynomi - voit aluksi käyttää numeerista integrointia * ja derivointia * - toteuta polynomialgebra, joka sisältää termi- ja polynomifunktiot, * termien yhteen- ja vähennyslaskun, integraalit ja derivaatat */ public class Integroi3 { interface FunktioRR { public double f(double x); public String toString(); public FunktioRR intfun(); public FunktioRR derfun(); public double defint(double x1, double x2); } public static PerusFunktio negator(final FunktioRR src) { return new PerusFunktio() { public double f(double x) { return -src.f(x); } public FunktioRR derfun() { return negator(src.derfun()); } public FunktioRR intfun() { return negator(src.intfun()); } public String toString() { return "- ("+src+")"; } }; } public static abstract class PerusFunktio implements FunktioRR { public double f(double x) { return 0; } public String toString() { return ""; } public double defint(double x1, double x2) { return intfun().f(x2)-intfun().f(x1); } public abstract FunktioRR derfun(); public abstract FunktioRR intfun(); } static class SinFun extends PerusFunktio { public double f(double x) { return Math.sin(x); } public FunktioRR derfun() { return new CosFun(); } public FunktioRR intfun() { return negator(new CosFun()); } public String toString() { return "sin"; } } static class CosFun extends PerusFunktio { public double f(double x) { return Math.cos(x); } public FunktioRR derfun() { return negator(new SinFun()); } public FunktioRR intfun() { return new SinFun(); } public String toString() { return "cos"; } } static class ExpFun extends PerusFunktio { public double f(double x) { return Math.exp(x); } public FunktioRR derfun() { return new ExpFun(); } public FunktioRR intfun() { return new ExpFun(); } public String toString() { return "exp"; } } static class OmaFun extends PerusFunktio { public double f(double x) { return 2*x -5; } public FunktioRR derfun() { return new Vakio(2);} public FunktioRR intfun() { return new PerusFunktio() { public double f(double x) { return (x*x)-(5*x); } public FunktioRR derfun() { return new OmaFun(); } public FunktioRR intfun() { return integraali(this); // todo: polynomialgebra :-) } public String toString() { return "x^2-5x"; } }; } } static class Vakio extends PerusFunktio { double value; public Vakio(double value) {this.value=value;} public double f(double x) { return value; } public FunktioRR derfun() { return new Vakio(0); } public FunktioRR intfun() { return new PerusFunktio() { public double f(double x) { return value*x; } public FunktioRR derfun() { return new Vakio(value); } public FunktioRR intfun() { return integraali(this); // todo: polynomialgebra :-) } public String toString() { return value+"x"; } }; } public String toString() { return ""+value; } } /** * Likimääräinen integraali-käytetään, jos analyyttista integraalia * ei ole käytettävissä */ public static PerusFunktio integraali(final FunktioRR ff) { return new PerusFunktio() { public double f(double x) { return integroi(ff,0,x,100); } public FunktioRR derfun() {return ff;} public FunktioRR intfun() {return integraali(ff);} public String toString() {return "I("+ff.toString()+")";} }; } /** * Esimerkki funktioiden yhdistämisestä */ public static PerusFunktio ynnaa(final FunktioRR a,final FunktioRR b) { return new PerusFunktio() { public double f(double x) { return a.f(x)+b.f(x); } public FunktioRR derfun() { // derivoinnin lineaarisuus return ynnaa (a.derfun(), b.derfun()); } public FunktioRR intfun() { // integroinnin lineaarisuus return ynnaa(a.intfun(),b.intfun()); } public String toString() {return a.toString()+" + "+b.toString();} }; } public static double integroi(FunktioRR f, double x1, double x2, int tiheys) { double x,dx,summa=0; dx = (x2- x1)/tiheys; for (x=x1+dx/2 ; x map(List D,FunktioRR f) { List result = new java.util.LinkedList(); for (double d : D) { result.add(f.f(d)); } return result; } public static void main(String[] args) { double ifx; OmaFun o = new OmaFun(); ifx = integroi(o.intfun(),0,5,100); System.out.println("Integraali I(omafun(x)) väliltä [0,5] on noin "+ Mjonot.fmt(ifx,7,5)); ifx = integroi(o,0,5,100); System.out.println("Integraali omafun(x) väliltä [0,5] on noin "+ Mjonot.fmt(ifx,7,5)); ifx = integroi(o.derfun(),0,5,100); System.out.println("Integraali D(omafun(x)) väliltä [0,5] on noin "+ Mjonot.fmt(ifx,7,5)); SinFun s = new SinFun(); CosFun c = new CosFun(); ifx = integroi(s,0,Math.PI,1000); System.out.println("Integraali sin(x) väliltä [0,pi] on noin "+ Mjonot.fmt(ifx,7,5)); System.out.println(s.derfun().derfun()); System.out.println(c.intfun()); ifx = integroi(new ExpFun(),0,1,500); System.out.println("Integraali exp(x) väliltä [0,1] on noin "+ Mjonot.fmt(ifx,7,5)); Vakio v1 = new Vakio(1); Vakio v2 = new Vakio(2); PerusFunktio f = ynnaa(v1,v2); ifx = integroi(f,0,5,100); System.out.println("Integraali "+f+" väliltä [0,5] on noin "+ Mjonot.fmt(ifx,7,5)); List dl = new java.util.LinkedList(); dl.add(1.0);dl.add(2.0);dl.add(3.0);dl.add(4.0);dl.add(5.0); System.out.println(dl); Listdm = map(dl,o); System.out.println(dm); } }