WaBis

walter.bislins.ch

Berechnung der Kurvenparameter s und t

Die Paraemter s und t der Hüllkurve (Ziel-SeiteFormel einer komplizierten Kurve herleiten) beeinflussen die Minima und Maxima der Kurve im Bereich 0 bis 6 und 6 bis 7.

  • s = berechne...
  • t = berechne...
  • ds = berechne...
  • dt = berechne...
  • Fehler = berechne...
  • Anzahl Itereationen = berechne...

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 );

More Page Infos / Sitemap
Created Mittwoch, 21. Mai 2014
Scroll to Top of Page
Changed Mittwoch, 21. Mai 2014