Die Paraemter s und t der Hüllkurve (Formel einer komplizierten Kurve herleiten) beeinflussen die Minima und Maxima der Kurve im Bereich 0 bis 6 und 6 bis 7.
Das nachfolgende Javascript optimiert diese Parameter durch systematisches Probieren, bis die Kurven in diesen Bereichen möglichst genau auf dem Wert 1 bzw. -1 zu liegen kommen.
// Gewünschte Genauigkeit der Parameter var eps = 0.000001; // Parameterwerte der gesuchten Funktion y(x) var params = { a: -69.45873, b: -2.660563, c: 3.126527, d: 2, p: 7.5, r: 0.5, s: 1.0, t: 0.5, v: 3.207433 } // Gesuchte Funktion function y(x) { var zz = z(x); var pp = Math.PI * n(zz); var r = (2 * Math.sin(pp) / pp) * h(zz); return r; } // Nullstellen Funktion function n(x) { var r = params.a * Math.pow( (x + params.v), params.b ) + params.c; return r; } // Hüllkurve function h(x) { var xx = params.d * x; var r = (1 - Math.exp( -(xx*xx) ) ) * (params.s * x*x + params.t) + 1; return r; } // Spiegelung und Verschiebung function z(x) { return Math.abs( x - params.p ); } // Ableitung von y(x) function dy(x) { var r = (y(x+eps) - y(x-eps)) / (2*eps); return r; } // Fehlerfunktion function err() { var n1 = SolveWithNewton( dy, 0, 4, eps ); var n2 = SolveWithNewton( dy, 0, 6.5, eps ); var y1 = y(n1); var y2 = y(n2); var d1 = 1 - y1; var d2 = -1 - y2; var r = d1*d1 + d2*d2; return r; } // Fehlerfunktion mit fixem t und variablem s function errs(s) { var ss = params.s; params.s = s; var e = err(); params.s = ss; return e; } // Fehlerfunktion mit fixem s und variablem t function errt(t) { var tt = params.t; params.t = t; var e = err(); params.t = tt; return e; } // d err(s,t) / d s function derrs(s) { var r = (errs(s+eps) - errs(s-eps)) / (2*eps); return r; } // d err(s,t) / d t function derrt(t) { var r = (errt(t+eps) - errt(t-eps)) / (2*eps); return r; } function Optimizer( aResolution ) { this.res = aResolution; this.n = 0; var me = this; setTimeout( function(){ me.Loop(); }, 1 ); } Optimizer.prototype.Loop = function() { var olds = params.s; var oldt = params.t; params.s = SolveWithNewton( derrs, 0, params.s ); params.t = SolveWithNewton( derrt, 0, params.t ); var ds = Math.abs( params.s - olds ); var dt = Math.abs( params.t - oldt ); var e = err(); this.n++; xInnerHTML( 'params', params.s.toString() ); xInnerHTML( 'paramt', params.t.toString() ); xInnerHTML( 'ds', ds.toString() ); xInnerHTML( 'dt', dt.toString() ); xInnerHTML( 'perr', e.toString() ); xInnerHTML( 'iter', this.n.toString() ); var me = this; if (ds > this.res || dt > this.res) setTimeout( function(){ me.Loop(); }, 100 ); } var opt = new Optimizer( 0.0000001 );