Snippets

aokomoriuta PowerShellで二分法による2元連立非線形方程式の求解

Created by aokomoriuta
# http://melpon.org/wandbox/permlink/b2DNhDxovkCVO1x9 のPowerShell版

function f($x, $y)
{
    return $y*$y*$y- 4* ($x*$x*$x + 1)
}

function g($x, $y)
{
    return [Math]::exp($y) - [Math]::exp(1.0/$y) - [Math]::exp($x) - [Math]::exp(-$x) - 3
}

$n = 32
[double] $x_lower = 5
[double] $x_upper = 0
[double] $y_lower = 0
[double] $y_upper = 10

$x = ($x_lower + $x_upper)/2;
$y = ($y_lower +$y_upper)/2;

$x0 = $x_lower;
$x1 = $x_upper;
for($i = 0; $i -le $n; $i++)
{
    $y0 = $y_lower;
    $y1 = $y_upper;
    $y = ($y0 + $y1)/2;
	if(g $x $y0 > g $x $y1)
	{
	    Write-Host "g(y_lower) > g(y_upper)"
        exit
	}
	for($j = 0; $j -le $n; $j++)
	{
	    $g_x_y = g $x $y;
	    # Write-Host ("{0}, {1}: {2},  {3},  {4},  {5},  {6},  {7},  {8}" -f $i, $j, $x0, $x1, $y0, $y1, $x, $y, $g_x_y)
	    if($g_x_y -lt 0)
	    {
	        $y0 = $y
	    }
	    else
	    {
	        $y1 = $y;
	    }
        $y = ($y0 + $y1)/2
	}
	$y = ($y0 + $y1)/2

    if(f $x0 $y > f $x1 $y)
	{
	    Write-Host "f(x_lower) > f(x_upper)"
        exit
	}
        
	$f_x_y = f $x $y
    # Write-Host $f_x_y
    if($f_x_y -lt 0)
    {
        $x0 = $x;
    }
    else
    {
        $x1 = $x;
    }
	$x = ($x0 + $x1)/2;
}

Write-Host ("{0}, {1}" -f $x, $y)

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.