@ -3,9 +3,9 @@
// http://numerics.mathdotnet.com
// http://github.com/mathnet/mathnet-numerics
// http://mathnetnumerics.codeplex.com
//
//
// Copyright (c) 2009-2013 Math.NET
//
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
@ -14,10 +14,10 @@
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@ -41,7 +41,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
public void MultipleRoots ( )
{
// Roots at -2, 2
Func < double , double > f1 = x = > x * x - 4 ;
Func < double , double > f1 = x = > x * x - 4 ;
Assert . AreEqual ( 0 , f1 ( Bisection . FindRoot ( f1 , 0 , 5 , 1e-14 ) ) ) ;
Assert . AreEqual ( 0 , f1 ( Bisection . FindRootExpand ( f1 , 3 , 4 , 1e-14 ) ) ) ;
Assert . AreEqual ( - 2 , Bisection . FindRoot ( f1 , - 5 , - 1 , 1e-14 ) ) ;
@ -51,7 +51,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
Assert . AreEqual ( 2 , Bisection . FindRoot ( x = > - f1 ( x ) , 1 , 4 , 1e-14 ) ) ;
// Roots at 3, 4
Func < double , double > f2 = x = > ( x - 3 ) * ( x - 4 ) ;
Func < double , double > f2 = x = > ( x - 3 ) * ( x - 4 ) ;
Assert . AreEqual ( 0 , f2 ( Bisection . FindRoot ( f2 , 3.5 , 5 , 1e-14 ) ) , 1e-14 ) ;
Assert . AreEqual ( 3 , Bisection . FindRoot ( f2 , - 5 , 3.5 , 1e-14 ) ) ;
Assert . AreEqual ( 4 , Bisection . FindRoot ( f2 , 3.2 , 5 , 1e-14 ) ) ;
@ -62,7 +62,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
[Test]
public void LocalMinima ( )
{
Func < double , double > f1 = x = > x * x * x - 2 * x + 2 ;
Func < double , double > f1 = x = > x * x * x - 2 * x + 2 ;
Assert . AreEqual ( 0 , f1 ( Bisection . FindRoot ( f1 , - 5 , 5 , 1e-14 ) ) , 1e-14 ) ;
Assert . AreEqual ( 0 , f1 ( Bisection . FindRoot ( f1 , - 2 , 4 , 1e-14 ) ) , 1e-14 ) ;
}
@ -70,7 +70,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
[Test]
public void NoRoot ( )
{
Func < double , double > f1 = x = > x * x + 4 ;
Func < double , double > f1 = x = > x * x + 4 ;
Assert . That ( ( ) = > Bisection . FindRoot ( f1 , - 5 , 5 , 1e-14 ) , Throws . TypeOf < NonConvergenceException > ( ) ) ;
}
@ -78,7 +78,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
public void Oneeq1 ( )
{
// Test case from http://www.polymath-software.com/library/nle/Oneeq1.htm
Func < double , double > f1 = z = > 8 * Math . Pow ( ( 4 - z ) * z , 2 ) / ( Math . Pow ( 6 - 3 * z , 2 ) * ( 2 - z ) ) - 0.186 ;
Func < double , double > f1 = z = > 8 * Math . Pow ( ( 4 - z ) * z , 2 ) / ( Math . Pow ( 6 - 3 * z , 2 ) * ( 2 - z ) ) - 0.186 ;
double x = Bisection . FindRoot ( f1 , 0.1 , 0.9 , accuracy : 1e-9 , maxIterations : 8 0 ) ;
Assert . AreEqual ( 0.277759543089215 , x , 1e-9 ) ;
Assert . AreEqual ( 0 , f1 ( x ) , 1e-16 ) ;
@ -94,15 +94,15 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double x2 = 1 - x1 ;
const double G12 = 0.07858889 ;
const double G21 = 0.30175355 ;
double P2 = Math . Pow ( 1 0 , 6.87776 - 1 1 7 1.53 / ( 2 2 4.366 + T ) ) ;
double P1 = Math . Pow ( 1 0 , 8.04494 - 1 5 5 4.3 / ( 2 2 2.65 + T ) ) ;
const double t1 = x1 + x2 * G12 ;
const double t2 = x2 + x1 * G21 ;
double gamma2 = Math . Exp ( - Math . Log ( t2 ) - ( x1 * ( G12 * t2 - G21 * t1 ) ) / ( t1 * t2 ) ) ;
double gamma1 = Math . Exp ( - Math . Log ( t1 ) + ( x2 * ( G12 * t2 - G21 * t1 ) ) / ( t1 * t2 ) ) ;
double k1 = gamma1 * P1 / 7 6 0 ;
double k2 = gamma2 * P2 / 7 6 0 ;
return 1 - k1 * x1 - k2 * x2 ;
double P2 = Math . Pow ( 1 0 , 6.87776 - 1 1 7 1.53 / ( 2 2 4.366 + T ) ) ;
double P1 = Math . Pow ( 1 0 , 8.04494 - 1 5 5 4.3 / ( 2 2 2.65 + T ) ) ;
const double t1 = x1 + x2 * G12 ;
const double t2 = x2 + x1 * G21 ;
double gamma2 = Math . Exp ( - Math . Log ( t2 ) - ( x1 * ( G12 * t2 - G21 * t1 ) ) / ( t1 * t2 ) ) ;
double gamma1 = Math . Exp ( - Math . Log ( t1 ) + ( x2 * ( G12 * t2 - G21 * t1 ) ) / ( t1 * t2 ) ) ;
double k1 = gamma1 * P1 / 7 6 0 ;
double k2 = gamma2 * P2 / 7 6 0 ;
return 1 - k1 * x1 - k2 * x2 ;
} ;
double x = Bisection . FindRoot ( f1 , 0 , 1 0 0 ) ;
@ -120,13 +120,13 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double x2 = 1 - x1 ;
const double A = 0.75807689 ;
const double B = 1.1249035 ;
double P2 = Math . Pow ( 1 0 , 6.9024 - 1 2 6 8.115 / ( 2 1 6.9 + T ) ) ;
double P1 = Math . Pow ( 1 0 , 8.04494 - 1 5 5 4.3 / ( 2 2 2.65 + T ) ) ;
double gamma2 = Math . Pow ( 1 0 , B * Math . Pow ( x1 , 2 ) / Math . Pow ( x1 + B * x2 / A , 2 ) ) ;
double gamma1 = Math . Pow ( 1 0 , A * Math . Pow ( x2 , 2 ) / Math . Pow ( A * x1 / B + x2 , 2 ) ) ;
double k1 = gamma1 * P1 / 7 6 0 ;
double k2 = gamma2 * P2 / 7 6 0 ;
return 1 - k1 * x1 - k2 * x2 ;
double P2 = Math . Pow ( 1 0 , 6.9024 - 1 2 6 8.115 / ( 2 1 6.9 + T ) ) ;
double P1 = Math . Pow ( 1 0 , 8.04494 - 1 5 5 4.3 / ( 2 2 2.65 + T ) ) ;
double gamma2 = Math . Pow ( 1 0 , B * Math . Pow ( x1 , 2 ) / Math . Pow ( x1 + B * x2 / A , 2 ) ) ;
double gamma1 = Math . Pow ( 1 0 , A * Math . Pow ( x2 , 2 ) / Math . Pow ( A * x1 / B + x2 , 2 ) ) ;
double k1 = gamma1 * P1 / 7 6 0 ;
double k2 = gamma2 * P2 / 7 6 0 ;
return 1 - k1 * x1 - k2 * x2 ;
} ;
double x = Bisection . FindRoot ( f1 , 0 , 1 0 0 ) ;
@ -138,7 +138,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
public void Oneeq3 ( )
{
// Test case from http://www.polymath-software.com/library/nle/Oneeq3.htm
Func < double , double > f1 = T = > Math . Exp ( 2 1 0 0 0 / T ) / ( T * T ) - 1.11e11 ;
Func < double , double > f1 = T = > Math . Exp ( 2 1 0 0 0 / T ) / ( T * T ) - 1.11e11 ;
double x = Bisection . FindRoot ( f1 , 5 5 0 , 5 6 0 , 1e-2 ) ;
Assert . AreEqual ( 5 5 1.773822885233 , x , 1e-5 ) ;
Assert . AreEqual ( 0 , f1 ( x ) , 1e-2 ) ;
@ -152,7 +152,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
{
const double A = 0.38969 ;
const double B = 0.55954 ;
return A * B * ( B * Math . Pow ( 1 - x , 2 ) - A * x * x ) / Math . Pow ( x * ( A - B ) + B , 2 ) + 0.14845 ;
return A * B * ( B * Math . Pow ( 1 - x , 2 ) - A * x * x ) / Math . Pow ( x * ( A - B ) + B , 2 ) + 0.14845 ;
} ;
double r = Bisection . FindRoot ( f1 , 0 , 1 ) ;
@ -170,7 +170,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double BETA = 2.298E-3 ;
const double GAMMA = 0.283E-6 ;
const double DH = - 5 7 7 9 8.0 ;
return DH + TR * ( ALPHA + TR * ( BETA / 2 + TR * GAMMA / 3 ) ) - 2 9 8.0 * ( ALPHA + 2 9 8.0 * ( BETA / 2 + 2 9 8.0 * GAMMA / 3 ) ) ;
return DH + TR * ( ALPHA + TR * ( BETA / 2 + TR * GAMMA / 3 ) ) - 2 9 8.0 * ( ALPHA + 2 9 8.0 * ( BETA / 2 + 2 9 8.0 * GAMMA / 3 ) ) ;
} ;
double x = Bisection . FindRoot ( f1 , 3 0 0 0 , 5 0 0 0 ) ;
@ -192,17 +192,17 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double A = 0.01855 ;
const double B = - 0.01587 ;
const double P = 1 0 0.0 ;
const double Beta = R * T * B0 - A0 - R * C / ( T * T ) ;
const double Gama = - R * T * B0 * B + A0 * A - R * C * B0 / ( T * T ) ;
const double Delta = R * B0 * B * C / ( T * T ) ;
const double Beta = R * T * B0 - A0 - R * C / ( T * T ) ;
const double Gama = - R * T * B0 * B + A0 * A - R * C * B0 / ( T * T ) ;
const double Delta = R * B0 * B * C / ( T * T ) ;
return R * T / V + Beta / ( V * V ) + Gama / ( V * V * V ) + Delta / ( V * V * V * V ) - P ;
return R * T / V + Beta / ( V * V ) + Gama / ( V * V * V ) + Delta / ( V * V * V * V ) - P ;
} ;
double x = Bisection . FindRoot ( f1 , 0.1 , 1 ) ;
Assert . AreEqual ( 0.174749531708621 , x , 1e-5 ) ;
Assert . AreEqual ( 0 , f1 ( x ) , 1e-12 ) ;
}
}
[Test]
public void Oneeq6b ( )
@ -218,23 +218,23 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double A = 0.01855 ;
const double B = - 0.01587 ;
const double P = 1 0 0.0 ;
const double Beta = R * T * B0 - A0 - R * C / ( T * T ) ;
const double Gama = - R * T * B0 * B + A0 * A - R * C * B0 / ( T * T ) ;
const double Delta = R * B0 * B * C / ( T * T ) ;
const double Beta = R * T * B0 - A0 - R * C / ( T * T ) ;
const double Gama = - R * T * B0 * B + A0 * A - R * C * B0 / ( T * T ) ;
const double Delta = R * B0 * B * C / ( T * T ) ;
return R * T * V * V * V + Beta * V * V + Gama * V + Delta - P * V * V * V * V ;
return R * T * V * V * V + Beta * V * V + Gama * V + Delta - P * V * V * V * V ;
} ;
double x = Bisection . FindRoot ( f1 , 0.1 , 1 ) ;
Assert . AreEqual ( 0.174749600398905 , x , 1e-5 ) ;
Assert . AreEqual ( 0 , f1 ( x ) , 1e-13 ) ;
}
}
[Test]
public void Oneeq7 ( )
{
// Test case from http://www.polymath-software.com/library/nle/Oneeq7.htm
Func < double , double > f1 = x = > x / ( 1 - x ) - 5 * Math . Log ( 0.4 * ( 1 - x ) / ( 0.4 - 0.5 * x ) ) + 4.45977 ;
Func < double , double > f1 = x = > x / ( 1 - x ) - 5 * Math . Log ( 0.4 * ( 1 - x ) / ( 0.4 - 0.5 * x ) ) + 4.45977 ;
double r = Bisection . FindRoot ( f1 , 0 , 0.79 , 1e-2 ) ;
Assert . AreEqual ( 0.757396293891 , r , 1e-5 ) ;
Assert . AreEqual ( 0 , f1 ( r ) , 1e-13 ) ;
@ -250,7 +250,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double b = 4 0 ;
const double c = 2 0 0 ;
return a * v * v + b * Math . Pow ( v , 7 / 4 ) - c ;
return a * v * v + b * Math . Pow ( v , 7 / 4 ) - c ;
} ;
double x = Bisection . FindRoot ( f1 , 0.01 , 1 ) ;
@ -269,7 +269,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double gama = 1.41 ;
const double Pd = 1 0 0 ;
return Math . Pow ( ( gama + 1 ) / 2 , ( gama + 1 ) / ( gama - 1 ) ) * ( 2 / ( gama - 1 ) ) * ( Math . Pow ( P / Pd , 2 / gama ) - Math . Pow ( P / Pd , ( gama + 1 ) / gama ) ) - Math . Pow ( At / A , 2 ) ;
return Math . Pow ( ( gama + 1 ) / 2 , ( gama + 1 ) / ( gama - 1 ) ) * ( 2 / ( gama - 1 ) ) * ( Math . Pow ( P / Pd , 2 / gama ) - Math . Pow ( P / Pd , ( gama + 1 ) / gama ) ) - Math . Pow ( At / A , 2 ) ;
} ;
double x = Bisection . FindRoot ( f1 , 1 , 5 0 ) ;
@ -284,7 +284,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
public void Oneeq10 ( )
{
// Test case from http://www.polymath-software.com/library/nle/Oneeq10.htm
Func < double , double > f1 = x = > ( 1.0 / 6 3.0 ) * Math . Log ( x ) + ( 6 4.0 / 6 3.0 ) * Math . Log ( 1 / ( 1 - x ) ) + Math . Log ( 0.95 - x ) - Math . Log ( 0.9 ) ;
Func < double , double > f1 = x = > ( 1.0 / 6 3.0 ) * Math . Log ( x ) + ( 6 4.0 / 6 3.0 ) * Math . Log ( 1 / ( 1 - x ) ) + Math . Log ( 0.95 - x ) - Math . Log ( 0.9 ) ;
double r = Bisection . FindRoot ( f1 , . 0 1 , 0.35 ) ;
Assert . AreEqual ( 0.036210083704 , r , 1e-5 ) ;
@ -306,7 +306,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double kp = 6 0 4 5 0 0 ;
const double P = 0.00243 ;
return a - Math . Pow ( ( c + 2 * x ) * ( a + b + c - 2 * x ) , 2 ) / ( kp * P * P * Math . Pow ( b - 3 * x , 3 ) ) - x ;
return a - Math . Pow ( ( c + 2 * x ) * ( a + b + c - 2 * x ) , 2 ) / ( kp * P * P * Math . Pow ( b - 3 * x , 3 ) ) - x ;
} ;
double r = Bisection . FindRoot ( f1 , 0 , 0.25 ) ;
@ -329,13 +329,13 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double kp = 6 0 4 5 0 0 ;
const double P = 0.00243 ;
return ( b - Math . Pow ( Math . Pow ( ( c + 2 * x ) * ( a + b + c - 2 * x ) , 2 ) / ( kp * P * P * ( a - x ) ) , 1.0 / 3.0 ) ) / 3.0 - x ;
return ( b - Math . Pow ( Math . Pow ( ( c + 2 * x ) * ( a + b + c - 2 * x ) , 2 ) / ( kp * P * P * ( a - x ) ) , 1.0 / 3.0 ) ) / 3.0 - x ;
} ;
double r = Bisection . FindRoot ( f1 , 0.01 , 0.45 ) ;
Assert . AreEqual ( 0.058654571042804 , r , 1e-5 ) ;
Assert . AreEqual ( 0 , f1 ( r ) , 1e-14 ) ;
// Could not test the following root, since Math.Pow(y,1/3) does not work for y<0
// Could not test the following root, since Math.Pow(y,1/3) does not work for y<0
// r = Bisection.FindRoot(f1, 0.55, 0.7);
// Assert.AreEqual(0.600323117488527, r, 1e-5);
// Assert.AreEqual(0, f1(r), 1e-14);
@ -353,7 +353,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double T = 4 3 0.85 ;
const double R = 8 2.05 ;
return ( R * T / P ) * ( 1 + b / v + c / ( v * v ) ) - v ;
return ( R * T / P ) * ( 1 + b / v + c / ( v * v ) ) - v ;
} ;
double x = Bisection . FindRoot ( f1 , 1 0 0 , 3 0 0 ) ;
@ -372,10 +372,10 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double P = 1 0 0 ;
const double T = 2 1 0.0 ;
const double R = 0.08205 ;
double A = 0.42748 * ( R * R * Math . Pow ( Tc , 2.5 ) ) / Pc ;
const double B = 0.08664 * R * Tc / Pc ;
double A = 0.42748 * ( R * R * Math . Pow ( Tc , 2.5 ) ) / Pc ;
const double B = 0.08664 * R * Tc / Pc ;
return R * Math . Pow ( T , 1.5 ) * V * ( V + B ) / ( P * Math . Sqrt ( T ) * V * ( V + B ) + A ) + B - V ;
return R * Math . Pow ( T , 1.5 ) * V * ( V + B ) / ( P * Math . Sqrt ( T ) * V * ( V + B ) + A ) + B - V ;
} ;
double x = Bisection . FindRoot ( f1 , . 0 1 , . 3 ) ;
@ -397,10 +397,10 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double T1 = 3 9 0.0 ;
const double t1 = 1 0 0.0 ;
const double cp = 0.49 ;
double DT1 = T1 - t1 - Q / ( M * Cp ) ;
double DT2 = T1 - t1 - Q / ( m * cp ) ;
double DT1 = T1 - t1 - Q / ( M * Cp ) ;
double DT2 = T1 - t1 - Q / ( m * cp ) ;
return U * A * ( DT2 - DT1 ) / Math . Log ( DT2 / DT1 ) - Q ;
return U * A * ( DT2 - DT1 ) / Math . Log ( DT2 / DT1 ) - Q ;
} ;
double x = Bisection . FindRoot ( f1 , 1 0 0 0 0 0 0 , 7 0 0 0 0 0 0 ) ;
@ -412,7 +412,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
public void Oneeq15a ( )
{
// Test case from http://www.polymath-software.com/library/nle/Oneeq15a.htm
Func < double , double > f1 = h = > h * ( 1 + h * ( 3 - h ) ) - 2.4 - h ;
Func < double , double > f1 = h = > h * ( 1 + h * ( 3 - h ) ) - 2.4 - h ;
double x = Bisection . FindRoot ( f1 , - 2 , 0 ) ;
Assert . AreEqual ( - 0.795219754733581 , x , 1e-5 ) ;
@ -429,7 +429,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
public void Oneeq15b ( )
{
// Test case from http://www.polymath-software.com/library/nle/Oneeq15b.htm
Func < double , double > f1 = h = > 2.4 / ( h * ( 3 - h ) ) - h ;
Func < double , double > f1 = h = > 2.4 / ( h * ( 3 - h ) ) - h ;
double x = Bisection . FindRoot ( f1 , - 2 , - 0.5 ) ;
Assert . AreEqual ( - 0.795219745444464 , x , 1e-5 ) ;
@ -453,18 +453,18 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double z = 1 - y - 0.02 ;
const double CH4 = 0 ;
const double C2H6 = 0 ;
const double COtwo = y + 2 * z ;
const double H2O = 2 * y + 3 * z ;
const double N2 = 0.02 + 3.76 * ( 2 * y + 7 * z / 2 ) * x ;
const double O2 = ( 2 * y + 7 * z / 2 ) * ( x - 1 ) ;
const double alp = 3.381 * CH4 + 2.247 * C2H6 + 6.214 * COtwo + 7.256 * H2O + 6.524 * N2 + 6.148 * O2 ;
const double bet = 1 8.044 * CH4 + 3 8.201 * C2H6 + 1 0.396 * COtwo + 2.298 * H2O + 1.25 * N2 + 3.102 * O2 ;
const double gam = - 4.3 * CH4 - 1 1.049 * C2H6 - 3.545 * COtwo + 0.283 * H2O - 0.001 * N2 - 0.923 * O2 ;
const double H0 = alp * 2 9 8 + bet * 0.001 * 2 9 8 * 2 9 8 / 2 + gam * 1e-6 * 2 9 8 * 2 9 8 * 2 9 8 / 3 ;
double Hf = alp * T + bet * 0.001 * T * T / 2 + gam * 1e-6 * T * T * T / 3 ;
const double COtwo = y + 2 * z ;
const double H2O = 2 * y + 3 * z ;
const double N2 = 0.02 + 3.76 * ( 2 * y + 7 * z / 2 ) * x ;
const double O2 = ( 2 * y + 7 * z / 2 ) * ( x - 1 ) ;
const double alp = 3.381 * CH4 + 2.247 * C2H6 + 6.214 * COtwo + 7.256 * H2O + 6.524 * N2 + 6.148 * O2 ;
const double bet = 1 8.044 * CH4 + 3 8.201 * C2H6 + 1 0.396 * COtwo + 2.298 * H2O + 1.25 * N2 + 3.102 * O2 ;
const double gam = - 4.3 * CH4 - 1 1.049 * C2H6 - 3.545 * COtwo + 0.283 * H2O - 0.001 * N2 - 0.923 * O2 ;
const double H0 = alp * 2 9 8 + bet * 0.001 * 2 9 8 * 2 9 8 / 2 + gam * 1e-6 * 2 9 8 * 2 9 8 * 2 9 8 / 3 ;
double Hf = alp * T + bet * 0.001 * T * T / 2 + gam * 1e-6 * T * T * T / 3 ;
const double xx = 1 ;
return 2 1 2 7 9 8 * y * xx + 3 7 2 8 2 0 * z * xx + H0 - Hf ;
return 2 1 2 7 9 8 * y * xx + 3 7 2 8 2 0 * z * xx + H0 - Hf ;
} ;
double r = Bisection . FindRoot ( f1 , 1 0 0 0 , 3 0 0 0 ) ;
@ -476,7 +476,7 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
public void Oneeq17 ( )
{
// Test case from http://www.polymath-software.com/library/nle/Oneeq17.htm
Func < double , double > f1 = rp = > rp - 0.327 * Math . Pow ( 0.06 - 1 6 1 * rp , 0.804 ) * Math . Exp ( - 5 2 3 0 / ( 1.987 * ( 3 7 3 + 1.84e6 * rp ) ) ) ;
Func < double , double > f1 = rp = > rp - 0.327 * Math . Pow ( 0.06 - 1 6 1 * rp , 0.804 ) * Math . Exp ( - 5 2 3 0 / ( 1.987 * ( 3 7 3 + 1.84e6 * rp ) ) ) ;
double x = Bisection . FindRoot ( f1 , 0 , 0.00035 ) ;
Assert . AreEqual ( 0.000340568862275 , x , 1e-5 ) ;
@ -489,12 +489,12 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
// Test case from http://www.polymath-software.com/library/nle/Oneeq18a.htm
Func < double , double > f1 = T = >
{
double Tp = ( 2 6 9.267 * T - 1 7 5 2 ) / 2 6 6.667 ;
double k = 0.0006 * Math . Exp ( 2 0.7 - 1 5 0 0 0 / Tp ) ;
double Pp = - ( 0.1 / ( 3 2 1 * ( 3 2 0.0 / 3 2 1.0 - ( 1 + k ) ) ) ) ;
double P = ( 3 2 0 * Pp + 0.1 ) / 3 2 1 ;
double Tp = ( 2 6 9.267 * T - 1 7 5 2 ) / 2 6 6.667 ;
double k = 0.0006 * Math . Exp ( 2 0.7 - 1 5 0 0 0 / Tp ) ;
double Pp = - ( 0.1 / ( 3 2 1 * ( 3 2 0.0 / 3 2 1.0 - ( 1 + k ) ) ) ) ;
double P = ( 3 2 0 * Pp + 0.1 ) / 3 2 1 ;
return 1.296 * ( T - Tp ) + 1 0 3 6 9 * k * Pp ;
return 1.296 * ( T - Tp ) + 1 0 3 6 9 * k * Pp ;
} ;
double x = Bisection . FindRoot ( f1 , 5 0 0 , 7 2 5 ) ;
@ -514,12 +514,12 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
// Test case from http://www.polymath-software.com/library/nle/Oneeq18b.htm
Func < double , double > f1 = T = >
{
double Tp = ( 2 6 9 * T - 1 7 5 2 ) / 2 6 7 ;
double k = 0.0006 * Math . Exp ( 2 0.7 - 1 5 0 0 0 / Tp ) ;
double Pp = - ( 0.1 / ( 3 2 1 * ( 3 2 0.0 / 3 2 1.0 - ( 1 + k ) ) ) ) ;
double P = ( 3 2 0 * Pp + 0.1 ) / 3 2 1 ;
double Tp = ( 2 6 9 * T - 1 7 5 2 ) / 2 6 7 ;
double k = 0.0006 * Math . Exp ( 2 0.7 - 1 5 0 0 0 / Tp ) ;
double Pp = - ( 0.1 / ( 3 2 1 * ( 3 2 0.0 / 3 2 1.0 - ( 1 + k ) ) ) ) ;
double P = ( 3 2 0 * Pp + 0.1 ) / 3 2 1 ;
return 1.3 * ( T - Tp ) + 1.04e4 * k * Pp ;
return 1.3 * ( T - Tp ) + 1.04e4 * k * Pp ;
} ;
double x = Bisection . FindRoot ( f1 , 5 0 0 , 1 5 0 0 ) ;
@ -537,25 +537,25 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double Pc = 3 3.5 ;
const double T = 6 3 1 * 2 ;
const double Tc = 1 2 6.2 ;
const double Pr = P / Pc ;
const double Tr = T / Tc ;
double Asqr = 0.4278 * Pr / Math . Pow ( Tr , 2.5 ) ;
const double B = 0.0867 * Pr / Tr ;
double Q = B * B + B - Asqr ;
double r = Asqr * B ;
double p = ( - 3 * Q - 1 ) / 3 ;
double q = ( - 2 7 * r - 9 * Q - 2 ) / 2 7 ;
double R = Math . Pow ( p / 3 , 3 ) + Math . Pow ( q / 2 , 2 ) ;
double V = ( R > 0 ) ? Math . Pow ( - q / 2 + Math . Sqrt ( R ) , 1 / 3 ) : 0 ;
double WW = ( R > 0 ) ? ( - q / 2 - Math . Sqrt ( R ) ) : ( 0 ) ;
double psi1 = ( R < 0 ) ? ( Math . Acos ( Math . Sqrt ( ( q * q / 4 ) / ( - p * p * p / 2 7 ) ) ) ) : ( 0 ) ;
double W = ( R > 0 ) ? ( Math . Sign ( WW ) * Math . Pow ( Math . Abs ( WW ) , 1 / 3 ) ) : ( 0 ) ;
double z1 = ( R < 0 ) ? ( 2 * Math . Sqrt ( - p / 3 ) * Math . Cos ( ( psi1 / 3 ) + 2 * 3.1416 * 0 / 3 ) + 1 / 3 ) : ( 0 ) ;
double z2 = ( R < 0 ) ? ( 2 * Math . Sqrt ( - p / 3 ) * Math . Cos ( ( psi1 / 3 ) + 2 * 3.1416 * 1 / 3 ) + 1 / 3 ) : ( 0 ) ;
double z3 = ( R < 0 ) ? ( 2 * Math . Sqrt ( - p / 3 ) * Math . Cos ( ( psi1 / 3 ) + 2 * 3.1416 * 2 / 3 ) + 1 / 3 ) : ( 0 ) ;
double z0 = ( R > 0 ) ? ( V + W + 1 / 3 ) : ( 0 ) ;
return z * z * z - z * z - Q * z - r ;
const double Pr = P / Pc ;
const double Tr = T / Tc ;
double Asqr = 0.4278 * Pr / Math . Pow ( Tr , 2.5 ) ;
const double B = 0.0867 * Pr / Tr ;
double Q = B * B + B - Asqr ;
double r = Asqr * B ;
double p = ( - 3 * Q - 1 ) / 3 ;
double q = ( - 2 7 * r - 9 * Q - 2 ) / 2 7 ;
double R = Math . Pow ( p / 3 , 3 ) + Math . Pow ( q / 2 , 2 ) ;
double V = ( R > 0 ) ? Math . Pow ( - q / 2 + Math . Sqrt ( R ) , 1 / 3 ) : 0 ;
double WW = ( R > 0 ) ? ( - q / 2 - Math . Sqrt ( R ) ) : ( 0 ) ;
double psi1 = ( R < 0 ) ? ( Math . Acos ( Math . Sqrt ( ( q * q / 4 ) / ( - p * p * p / 2 7 ) ) ) ) : ( 0 ) ;
double W = ( R > 0 ) ? ( Math . Sign ( WW ) * Math . Pow ( Math . Abs ( WW ) , 1 / 3 ) ) : ( 0 ) ;
double z1 = ( R < 0 ) ? ( 2 * Math . Sqrt ( - p / 3 ) * Math . Cos ( ( psi1 / 3 ) + 2 * 3.1416 * 0 / 3 ) + 1 / 3 ) : ( 0 ) ;
double z2 = ( R < 0 ) ? ( 2 * Math . Sqrt ( - p / 3 ) * Math . Cos ( ( psi1 / 3 ) + 2 * 3.1416 * 1 / 3 ) + 1 / 3 ) : ( 0 ) ;
double z3 = ( R < 0 ) ? ( 2 * Math . Sqrt ( - p / 3 ) * Math . Cos ( ( psi1 / 3 ) + 2 * 3.1416 * 2 / 3 ) + 1 / 3 ) : ( 0 ) ;
double z0 = ( R > 0 ) ? ( V + W + 1 / 3 ) : ( 0 ) ;
return z * z * z - z * z - Q * z - r ;
} ;
double x = Bisection . FindRoot ( f1 , - 0.5 , - 0.02 ) ;
@ -579,25 +579,25 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
const double Pc = 3 3.5 ;
const double T = 6 3 1 ;
const double Tc = 1 2 6.2 ;
const double Pr = P / Pc ;
const double Tr = T / Tc ;
double Asqr = 0.4278 * Pr / Math . Pow ( Tr , 2.5 ) ;
const double B = 0.0867 * Pr / Tr ;
double Q = B * B + B - Asqr ;
double r = Asqr * B ;
double p = ( - 3 * Q - 1 ) / 3 ;
double q = ( - 2 7 * r - 9 * Q - 2 ) / 2 7 ;
double R = Math . Pow ( p / 3 , 3 ) + Math . Pow ( q / 2 , 2 ) ;
double V = ( R > 0 ) ? Math . Pow ( - q / 2 + Math . Sqrt ( R ) , 1 / 3 ) : 0 ;
double WW = ( R > 0 ) ? ( - q / 2 - Math . Sqrt ( R ) ) : ( 0 ) ;
double psi1 = ( R < 0 ) ? ( Math . Acos ( Math . Sqrt ( ( q * q / 4 ) / ( - p * p * p / 2 7 ) ) ) ) : ( 0 ) ;
double W = ( R > 0 ) ? ( Math . Sign ( WW ) * Math . Pow ( Math . Abs ( WW ) , 1 / 3 ) ) : ( 0 ) ;
double z1 = ( R < 0 ) ? ( 2 * Math . Sqrt ( - p / 3 ) * Math . Cos ( ( psi1 / 3 ) + 2 * 3.1416 * 0 / 3 ) + 1 / 3 ) : ( 0 ) ;
double z2 = ( R < 0 ) ? ( 2 * Math . Sqrt ( - p / 3 ) * Math . Cos ( ( psi1 / 3 ) + 2 * 3.1416 * 1 / 3 ) + 1 / 3 ) : ( 0 ) ;
double z3 = ( R < 0 ) ? ( 2 * Math . Sqrt ( - p / 3 ) * Math . Cos ( ( psi1 / 3 ) + 2 * 3.1416 * 2 / 3 ) + 1 / 3 ) : ( 0 ) ;
double z0 = ( R > 0 ) ? ( V + W + 1 / 3 ) : ( 0 ) ;
return z * z * z - z * z - Q * z - r ;
const double Pr = P / Pc ;
const double Tr = T / Tc ;
double Asqr = 0.4278 * Pr / Math . Pow ( Tr , 2.5 ) ;
const double B = 0.0867 * Pr / Tr ;
double Q = B * B + B - Asqr ;
double r = Asqr * B ;
double p = ( - 3 * Q - 1 ) / 3 ;
double q = ( - 2 7 * r - 9 * Q - 2 ) / 2 7 ;
double R = Math . Pow ( p / 3 , 3 ) + Math . Pow ( q / 2 , 2 ) ;
double V = ( R > 0 ) ? Math . Pow ( - q / 2 + Math . Sqrt ( R ) , 1 / 3 ) : 0 ;
double WW = ( R > 0 ) ? ( - q / 2 - Math . Sqrt ( R ) ) : ( 0 ) ;
double psi1 = ( R < 0 ) ? ( Math . Acos ( Math . Sqrt ( ( q * q / 4 ) / ( - p * p * p / 2 7 ) ) ) ) : ( 0 ) ;
double W = ( R > 0 ) ? ( Math . Sign ( WW ) * Math . Pow ( Math . Abs ( WW ) , 1 / 3 ) ) : ( 0 ) ;
double z1 = ( R < 0 ) ? ( 2 * Math . Sqrt ( - p / 3 ) * Math . Cos ( ( psi1 / 3 ) + 2 * 3.1416 * 0 / 3 ) + 1 / 3 ) : ( 0 ) ;
double z2 = ( R < 0 ) ? ( 2 * Math . Sqrt ( - p / 3 ) * Math . Cos ( ( psi1 / 3 ) + 2 * 3.1416 * 1 / 3 ) + 1 / 3 ) : ( 0 ) ;
double z3 = ( R < 0 ) ? ( 2 * Math . Sqrt ( - p / 3 ) * Math . Cos ( ( psi1 / 3 ) + 2 * 3.1416 * 2 / 3 ) + 1 / 3 ) : ( 0 ) ;
double z0 = ( R > 0 ) ? ( V + W + 1 / 3 ) : ( 0 ) ;
return z * z * z - z * z - Q * z - r ;
} ;
double x = Bisection . FindRoot ( f1 , - 0.5 , 1.2 ) ;
@ -613,14 +613,14 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
{
const double T = 3 1 3 ;
const double P0 = 1 0 ;
const double FA0 = 2 0 * P0 / ( 0.082 * 4 5 0 ) ;
double k1 = 1.277 * 1.0e9 * Math . Exp ( - 9 0 0 0 0 / ( 8.31 * T ) ) ;
double k2 = 1.29 * 1.0e11 * Math . Exp ( - 1 3 5 0 0 0 / ( 8.31 * T ) ) ;
double den = 1 + 7 * P0 * ( 1 - xa ) / ( 1 + xa ) ;
const double FA0 = 2 0 * P0 / ( 0.082 * 4 5 0 ) ;
double k1 = 1.277 * 1.0e9 * Math . Exp ( - 9 0 0 0 0 / ( 8.31 * T ) ) ;
double k2 = 1.29 * 1.0e11 * Math . Exp ( - 1 3 5 0 0 0 / ( 8.31 * T ) ) ;
double den = 1 + 7 * P0 * ( 1 - xa ) / ( 1 + xa ) ;
double xa1 = 1 + xa ;
double ra = ( - k1 * P0 * ( 1 - xa ) / xa1 + k2 * P0 * P0 * xa * xa / ( xa1 * xa1 ) ) / den ;
double ra = ( - k1 * P0 * ( 1 - xa ) / xa1 + k2 * P0 * P0 * xa * xa / ( xa1 * xa1 ) ) / den ;
return - ra / FA0 ;
return - ra / FA0 ;
} ;
double x = Bisection . FindRoot ( f1 , 0.75 , 1.02 ) ;
@ -636,13 +636,13 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
{
const double T = 3 1 3 ;
const double P0 = 1 0 ;
const double FA0 = 2 0 * P0 / ( 0.082 * 4 5 0 ) ;
double k1 = 1.277 * 1.0e9 * Math . Exp ( - 9 0 0 0 0 / ( 8.31 * T ) ) ;
double k2 = 1.29 * 1.0e11 * Math . Exp ( - 1 3 5 0 0 0 / ( 8.31 * T ) ) ;
const double FA0 = 2 0 * P0 / ( 0.082 * 4 5 0 ) ;
double k1 = 1.277 * 1.0e9 * Math . Exp ( - 9 0 0 0 0 / ( 8.31 * T ) ) ;
double k2 = 1.29 * 1.0e11 * Math . Exp ( - 1 3 5 0 0 0 / ( 8.31 * T ) ) ;
double xa1 = 1 + xa ;
double ra = ( - k1 * P0 * ( 1 - xa ) / xa1 + k2 * P0 * P0 * xa * xa / ( xa1 * xa1 ) ) ;
double ra = ( - k1 * P0 * ( 1 - xa ) / xa1 + k2 * P0 * P0 * xa * xa / ( xa1 * xa1 ) ) ;
return - ra / FA0 ;
return - ra / FA0 ;
} ;
double x = Bisection . FindRoot ( f1 , 0.75 , 1.02 ) ;
@ -656,37 +656,37 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
// Test case from http://www.polymath-software.com/library/nle/Oneeq21a.htm
Func < double , double > f1 = h = >
{
double sg = Math . Acos ( 2 * h - 1 ) ;
double si = Math . Pow ( 1 - Math . Pow ( 2 * h - 1 , 2 ) , 0.5 ) ;
double ag = ( sg - ( 2 * h - 1 ) * si ) / 4 ;
double al = 3.1415927 / 4 - ag ;
double sg = Math . Acos ( 2 * h - 1 ) ;
double si = Math . Pow ( 1 - Math . Pow ( 2 * h - 1 , 2 ) , 0.5 ) ;
double ag = ( sg - ( 2 * h - 1 ) * si ) / 4 ;
double al = 3.1415927 / 4 - ag ;
const double d = 1.44 ;
double dg = 4 * ag / ( sg + si ) * d ;
double dg = 4 * ag / ( sg + si ) * d ;
const double ugs = - 0.0295 ;
double ug = ugs * 3.1415927 / 4 / ag ;
double ug = ugs * 3.1415927 / 4 / ag ;
const double uls = - 0.00001 ;
double ul = uls * 3.1415927 / 4 / al ;
double ul = uls * 3.1415927 / 4 / al ;
double sl = 3.1415927 - sg ;
double dl = 4 * al / ( sl ) * d ;
double dl = 4 * al / ( sl ) * d ;
const double rol = 1 ;
const double rog = 0.835 ;
const double bt = . 6 ;
double g = 9 8 0 * Math . Sin ( bt * 3.1415927 / 1 8 0 ) ;
double dpg = ( rol * al + rog * ag ) * g / 3.1415927 * 4 ;
double g = 9 8 0 * Math . Sin ( bt * 3.1415927 / 1 8 0 ) ;
double dpg = ( rol * al + rog * ag ) * g / 3.1415927 * 4 ;
const double vig = 1.0 ;
double reg = Math . Abs ( ug ) * rog * dg / vig ;
double tg = - 1 6 / reg * ( . 5 * rog * ug * Math . Abs ( ug ) ) ;
double reg = Math . Abs ( ug ) * rog * dg / vig ;
double tg = - 1 6 / reg * ( . 5 * rog * ug * Math . Abs ( ug ) ) ;
const double vil = . 0 1 ;
double rel = Math . Abs ( ul ) * rol * dl / vil ;
double tl = - 1 6 / rel * ( . 5 * rol * ul * Math . Abs ( ul ) ) ;
double rel = Math . Abs ( ul ) * rol * dl / vil ;
double tl = - 1 6 / rel * ( . 5 * rol * ul * Math . Abs ( ul ) ) ;
const double it = 1 ;
double ti = - 1 6 / reg * rog * ( . 5 * ( ug - ul ) * Math . Abs ( ug - ul ) ) * it ;
double dpf = ( tl * sl + tg * sg ) * d / ( al + ag ) / ( d * d ) * 4 ;
double ti = - 1 6 / reg * rog * ( . 5 * ( ug - ul ) * Math . Abs ( ug - ul ) ) * it ;
double dpf = ( tl * sl + tg * sg ) * d / ( al + ag ) / ( d * d ) * 4 ;
double dp = dpg + dpf ;
double tic = ( Math . Abs ( ul ) < Math . Abs ( ug ) ) ? ( rog / reg ) : ( rol / rel ) ;
double y = ( rol - rog ) * g * Math . Pow ( d / 2 , 2 ) / ( 8 * vig * ugs ) ;
double tic = ( Math . Abs ( ul ) < Math . Abs ( ug ) ) ? ( rog / reg ) : ( rol / rel ) ;
double y = ( rol - rog ) * g * Math . Pow ( d / 2 , 2 ) / ( 8 * vig * ugs ) ;
return - tg * sg * al + tl * sl * ag - ti * si * ( al + ag ) + d * ( rol - rog ) * al * ag * g ;
return - tg * sg * al + tl * sl * ag - ti * si * ( al + ag ) + d * ( rol - rog ) * al * ag * g ;
} ;
double x = Bisection . FindRoot ( f1 , 0 , 0.3 ) ;
@ -700,37 +700,37 @@ namespace MathNet.Numerics.UnitTests.RootFindingTests
// Test case from http://www.polymath-software.com/library/nle/Oneeq21b.htm
Func < double , double > f1 = h = >
{
double sg = Math . Acos ( 2 * h - 1 ) ;
double si = Math . Pow ( 1 - Math . Pow ( 2 * h - 1 , 2 ) , 0.5 ) ;
double ag = ( sg - ( 2 * h - 1 ) * si ) / 4 ;
double al = 3.1415927 / 4 - ag ;
double sg = Math . Acos ( 2 * h - 1 ) ;
double si = Math . Pow ( 1 - Math . Pow ( 2 * h - 1 , 2 ) , 0.5 ) ;
double ag = ( sg - ( 2 * h - 1 ) * si ) / 4 ;
double al = 3.1415927 / 4 - ag ;
const double d = 1.44 ;
double dg = 4 * ag / ( sg + si ) * d ;
double dg = 4 * ag / ( sg + si ) * d ;
const double ugs = - 0.029 ;
double ug = ugs * 3.1415927 / 4 / ag ;
double ug = ugs * 3.1415927 / 4 / ag ;
const double uls = - 0.00001 ;
double ul = uls * 3.1415927 / 4 / al ;
double ul = uls * 3.1415927 / 4 / al ;
double sl = 3.1415927 - sg ;
double dl = 4 * al / ( sl ) * d ;
double dl = 4 * al / ( sl ) * d ;
const double rol = 1 ;
const double rog = 0.835 ;
const double bt = . 6 ;
double g = 9 8 0 * Math . Sin ( bt * 3.1415927 / 1 8 0 ) ;
double dpg = ( rol * al + rog * ag ) * g / 3.1415927 * 4 ;
double g = 9 8 0 * Math . Sin ( bt * 3.1415927 / 1 8 0 ) ;
double dpg = ( rol * al + rog * ag ) * g / 3.1415927 * 4 ;
const double vig = 1.0 ;
double reg = Math . Abs ( ug ) * rog * dg / vig ;
double tg = - 1 6 / reg * ( . 5 * rog * ug * Math . Abs ( ug ) ) ;
double reg = Math . Abs ( ug ) * rog * dg / vig ;
double tg = - 1 6 / reg * ( . 5 * rog * ug * Math . Abs ( ug ) ) ;
const double vil = . 0 1 ;
double rel = Math . Abs ( ul ) * rol * dl / vil ;
double tl = - 1 6 / rel * ( . 5 * rol * ul * Math . Abs ( ul ) ) ;
double rel = Math . Abs ( ul ) * rol * dl / vil ;
double tl = - 1 6 / rel * ( . 5 * rol * ul * Math . Abs ( ul ) ) ;
const double it = 1 ;
double ti = - 1 6 / reg * rog * ( . 5 * ( ug - ul ) * Math . Abs ( ug - ul ) ) * it ;
double dpf = ( tl * sl + tg * sg ) * d / ( al + ag ) / ( d * d ) * 4 ;
double ti = - 1 6 / reg * rog * ( . 5 * ( ug - ul ) * Math . Abs ( ug - ul ) ) * it ;
double dpf = ( tl * sl + tg * sg ) * d / ( al + ag ) / ( d * d ) * 4 ;
double dp = dpg + dpf ;
double tic = ( Math . Abs ( ul ) < Math . Abs ( ug ) ) ? ( rog / reg ) : ( rol / rel ) ;
double y = ( rol - rog ) * g * Math . Pow ( d / 2 , 2 ) / ( 8 * vig * ugs ) ;
double tic = ( Math . Abs ( ul ) < Math . Abs ( ug ) ) ? ( rog / reg ) : ( rol / rel ) ;
double y = ( rol - rog ) * g * Math . Pow ( d / 2 , 2 ) / ( 8 * vig * ugs ) ;
return - tg * sg * al + tl * sl * ag - ti * si * ( al + ag ) + d * ( rol - rog ) * al * ag * g ;
return - tg * sg * al + tl * sl * ag - ti * si * ( al + ag ) + d * ( rol - rog ) * al * ag * g ;
} ;
double x = Bisection . FindRoot ( f1 , 0 , 0.1 ) ;