Пример #1
0
        private void wfFormula()
        {
            if (m_Dn.Value == fsValue.Zero)
            {
                if (m_xStar.Value == fsValue.One)
                {
                    m_wf.Value = fsValue.Zero;
                    return;
                }
                else
                {
                    m_wf.Value = new fsValue();
                    return;
                }
            }
            if (fsValue.One == m_xStar.Value)
            {
                m_wf.Value = fsValue.Zero;
                return;
            }
            bool condEmpty = fsValue.Less(m_Dn.Value, fsValue.Zero) ||
                             fsValue.Less(fsValue.One, m_xStar.Value);

            if (condEmpty)
            {
                m_wf.Value = new fsValue();
            }
            else
            {
                fsValue u = m_xStar.Value;
                var     f = new wfCalculationFunction(m_Dn.Value, u);
                fsValue lowerBound;
                fsValue upperBound;
                if (fsValue.Greater(u, fsValue.Exp(m_Dn.Value) * fsValue.Erfc(fsValue.Sqrt(m_Dn.Value))))
                {
                    lowerBound = fsValue.Zero;
                    upperBound = fsValue.Sqrt(m_Dn.Value / (fsValue.Sqr(2 / u - 1) - 1));
                }
                else
                {
                    lowerBound = -1.0 * fsValue.Max(fsValue.One,
                                                    fsValue.InvErf(1.0 - u / (1.0 + fsValue.Sqrt(1.0 + m_Dn.Value)))
                                                    );
                    upperBound = fsValue.Zero;
                }

                fsValue x = fsBisectionMethod.FindRoot(f, lowerBound, upperBound, 60);
                x          = 2 * x / fsValue.Sqrt(m_Dn.Value);
                m_wf.Value = 1 + 0.5 * x * (x - fsValue.Sqrt(fsValue.Sqr(x) + 4));
            }
        }
Пример #2
0
        private void wfFormula()
        {
            if (fsValue.One == m_cStar.Value)
            {
                m_wf.Value = fsValue.Zero;
                return;
            }
            bool condEmpty = fsValue.Less(m_Dn.Value, fsValue.Zero) ||
                             fsValue.Less(fsValue.One, m_cStar.Value);

            if (condEmpty)
            {
                m_wf.Value = new fsValue();
            }
            else
            {
                fsValue u = 2 * (1 - m_cStar.Value);
                var     f = new wfCalculationFunction(m_Dn.Value, u);
                fsValue lowerBound;
                fsValue upperBound;
                if (fsValue.Less(u, 1.0 + fsValue.Exp(m_Dn.Value) * fsValue.Erfc(fsValue.Sqrt(m_Dn.Value))))
                {
                    lowerBound = fsValue.Zero;
                    upperBound = fsValue.Max(fsValue.One,
                                             fsValue.Sqrt(fsValue.Log(2 / (u * Math.Sqrt(Math.PI))))
                                             );
                }
                else
                {
                    lowerBound = -1.0 * fsValue.InvErf(u - 1.0);
                    upperBound = fsValue.Zero;
                }

                fsValue x = fsBisectionMethod.FindRoot(f, lowerBound, upperBound, 60);
                x          = 2 * x / fsValue.Sqrt(m_Dn.Value);
                m_wf.Value = 1 + 0.5 * x * (x - fsValue.Sqrt(fsValue.Sqr(x) + 4));
            }
        }
Пример #3
0
        private void wfFormula()
        {
            bool cwEqualsCa = (m_cw.Value == m_ca.Value);

            if (m_Dn.Value == fsValue.Zero)
            {
                if (cwEqualsCa)
                {
                    m_wf.Value = fsValue.One;
                    return;
                }
                else
                {
                    m_wf.Value = new fsValue();
                    return;
                }
            }
            if (m_cw.Value == m_c0.Value)
            {
                if (cwEqualsCa)
                {
                    m_wf.Value = fsValue.One;
                    return;
                }
                else
                {
                    m_wf.Value = new fsValue();
                    return;
                }
            }

            fsValue u         = (m_ca.Value - m_c0.Value) / (m_cw.Value - m_c0.Value);
            bool    condEmpty = fsValue.Less(m_Dn.Value, fsValue.Zero) ||
                                fsValue.Less(u, fsValue.Zero) ||
                                u == fsValue.Zero ||
                                fsValue.Less(fsValue.One, u) ||
                                u == fsValue.One;

            if (condEmpty)
            {
                m_wf.Value = new fsValue();
            }
            else
            {
                var     f = new wfCalculationFunction(m_Dn.Value, u);
                fsValue lowerBound;
                fsValue upperBound;
                if (fsValue.Less(u, fsValue.Exp(m_Dn.Value) * fsValue.Erfc(fsValue.Sqrt(m_Dn.Value))))
                {
                    lowerBound = fsValue.Zero;
                    fsValue sqrt = 1 / fsValue.Sqrt(m_Dn.Value);
                    fsValue b    = sqrt * (1 + sqrt) / Math.Sqrt(Math.PI);
                    upperBound = 1 + fsValue.Sqrt(fsValue.Log(b / u));
                }
                else
                {
                    lowerBound = -1.0 * fsValue.Sqrt(m_Dn.Value / (fsValue.Sqr(2 / u - 1) - 1));
                    upperBound = fsValue.Zero;
                }

                fsValue x = fsBisectionMethod.FindRoot(f, lowerBound, upperBound, 60);
                x          = 2 * x / fsValue.Sqrt(m_Dn.Value);
                m_wf.Value = 1 + 0.5 * x * (x - fsValue.Sqrt(fsValue.Sqr(x) + 4));
            }
        }