| 情報学部 | 菅沼ホーム | 目次 | 索引 |
/****************************/
/* シンプソン則 */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
#include <math.h>
double snx(double);
double simpson(double, double, int, double(*)(double));
int main()
{
double y, pi2 = 2.0 * atan(1.0);
y = simpson(0.0, pi2, 100, snx);
printf("result %f\n", y);
return 0;
}
/****************/
/* 関数値の計算 */
/****************/
double snx(double x)
{
return sin(x);
}
/*******************************************************/
/* 数値積分(シンプソン則) */
/* x1 : 下限 */
/* x2 : 上限 */
/* n : 分割数 */
/* fun : 関数名(f) */
/* return : 積分値 */
/*******************************************************/
double simpson(double x1, double x2, int n, double(*fun)(double))
{
double s1 = 0.0;
double s2 = 0.0;
double s, x, h, h2;
h = (x2 - x1) / n;
h2 = 2.0 * h;
for (x = x1+h; x < x2; x += h2)
s1 += (*fun)(x);
for (x = x1+h2; x < x2-h; x += h2)
s2 += (*fun)(x);
s = h * ((*fun)(x1) + (*fun)(x2) + 4.0 * s1 + 2.0 * s2) / 3.0;
return s;
}
/****************************/
/* シンプソン則 */
/* coded by Y.Suganuma */
/****************************/
import java.io.*;
public class Test {
public static void main(String args[]) throws IOException
{
double y;
Kansu kn = new Kansu();
y = kn.simpson(0.0, 0.5*Math.PI, 100);
System.out.println("result " + y);
}
}
/****************/
/* 関数値の計算 */
/****************/
class Kansu extends Simpson
{
double snx(double x)
{
double y = Math.sin(x);
return y;
}
}
abstract class Simpson {
/*******************************************************/
/* 数値積分(シンプソン則) */
/* x1 : 下限 */
/* x2 : 上限 */
/* n : 分割数 */
/* return : 積分値 */
/*******************************************************/
abstract double snx(double x);
double simpson(double x1, double x2, int n)
{
double s1 = 0.0;
double s2 = 0.0;
double s, x, h, h2;
h = (x2 - x1) / n;
h2 = 2.0 * h;
for (x = x1+h; x < x2; x += h2)
s1 += snx(x);
for (x = x1+h2; x < x2-h; x += h2)
s2 += snx(x);
s = h * (snx(x1) + snx(x2) + 4.0 * s1 + 2.0 * s2) / 3.0;
return s;
}
}
<!DOCTYPE HTML>
<HTML>
<HEAD>
<TITLE>数値積分(シンプソン則)</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
<SCRIPT TYPE="text/javascript">
str = "";
function main()
{
str = document.getElementById("func").value + ";";
// データの設定
let n = parseInt(document.getElementById("haba").value);
let x1 = parseFloat(document.getElementById("x1").value);
let x2 = parseFloat(document.getElementById("x2").value);
// 実行
let x = simpson(x1, x2, n, snx);
// 結果
let c = 100000;
let s1 = Math.round(x * c) / c;
document.getElementById("res").value = s1;
}
/****************/
/* 関数値の計算 */
/****************/
function snx(x)
{
let y = eval(str);
return y;
}
/**********************************/
/* 数値積分(シンプソン則) */
/* x1 : 下限 */
/* x2 : 上限 */
/* n : 分割数 */
/* fn : 関数値を計算する関数 */
/* return : 積分値 */
/**********************************/
function simpson(x1, x2, n, fn)
{
let s1 = 0.0;
let s2 = 0.0;
let h = (x2 - x1) / n;
let h2 = 2.0 * h;
for (let x = x1+h; x < x2; x += h2)
s1 += fn(x);
for (let x = x1+h2; x < x2-h; x += h2)
s2 += fn(x);
let s = h * (fn(x1) + fn(x2) + 4.0 * s1 + 2.0 * s2) / 3.0;
return s;
}
</SCRIPT>
</HEAD>
<BODY STYLE="font-size: 130%; background-color: #eeffee;">
<H2 STYLE="text-align:center"><B>数値積分(シンプソン則)</B></H2>
<DL>
<DT> テキストフィールドには,例として,sin(x) を 0 から π/2 まで積分する場合に対する値が設定されています.他の問題を実行する場合は,それらを適切に修正してください.なお,式は,JavaScript の仕様に適合した形式で記述してあることに注意してください.
</DL>
<DIV STYLE="text-align:center">
積分範囲:<INPUT ID="x1" STYLE="font-size: 100%" TYPE="text" SIZE="10" VALUE="0.0">,
<INPUT ID="x2" STYLE="font-size: 100%" TYPE="text" SIZE="10" VALUE="1.570796327">
分割:<INPUT ID="haba" STYLE="font-size: 100%" TYPE="text" SIZE="5" VALUE="100"><BR><BR>
式:<INPUT ID="func" STYLE="font-size: 100%" TYPE="text" SIZE="50" VALUE="Math.sin(x)">
<BUTTON STYLE="font-size: 100%; background-color: pink" onClick="main()">実行</BUTTON><BR><BR>
結果:<INPUT ID="res" STYLE="font-size: 100%" TYPE="text" SIZE="10">
</DIV>
</BODY>
</HTML>
<?php
/****************************/
/* シンプソン則 */
/* coded by Y.Suganuma */
/****************************/
$pi2 = 2.0 * atan(1.0);
$y = simpson(0.0, $pi2, 100, "snx");
printf("result %f\n", $y);
/****************/
/* 関数値の計算 */
/****************/
function snx($x)
{
return sin($x);
}
/*******************************************************/
/* 数値積分(シンプソン則) */
/* x1 : 下限 */
/* x2 : 上限 */
/* n : 分割数 */
/* fun : 関数名(f) */
/* return : 積分値 */
/*******************************************************/
function simpson($x1, $x2, $n, $fun)
{
$s1 = 0.0;
$s2 = 0.0;
$h = ($x2 - $x1) / $n;
$h2 = 2.0 * $h;
for ($x = $x1+$h; $x < $x2; $x += $h2)
$s1 += $fun($x);
for ($x = $x1+$h2; $x < $x2-$h; $x += $h2)
$s2 += $fun($x);
$s = $h * ($fun($x1) + $fun($x2) + 4.0 * $s1 + 2.0 * $s2) / 3.0;
return $s;
}
?>
#***************************/
# シンプソン則 */
# coded by Y.Suganuma */
#***************************/
#***************/
# 関数値の計算 */
#***************/
snx = Proc.new { |x|
Math.sin(x)
}
#******************************************************/
# 数値積分(シンプソン則) */
# x1 : 下限 */
# x2 : 上限 */
# n : 分割数 */
# fun : 関数名(f) */
# return : 積分値 */
#******************************************************/
def simpson(x1, x2, n, &fun)
s1 = 0.0
s2 = 0.0
h = (x2 - x1) / n
h2 = 2.0 * h
x = x1 + h
while x < x2
s1 += fun.call(x)
x += h2
end
x = x1 + h2
while x < x2-h
s2 += fun.call(x)
x += h2
end
s = h * (fun.call(x1) + fun.call(x2) + 4.0 * s1 + 2.0 * s2) / 3.0
return s
end
pi2 = 2.0 * Math.atan(1.0)
y = simpson(0.0, pi2, 100, &snx)
printf("result %f\n", y)
# -*- coding: UTF-8 -*-
import numpy as np
from math import *
############################################
# 数値積分(シンプソン則)
# x1 : 下限
# x2 : 上限
# n : 分割数
# fun : 関数名(f)
# return : 積分値
# coded by Y.Suganuma
############################################
def simpson(x1, x2, n, fun) :
s1 = 0.0
s2 = 0.0
h = (x2 - x1) / n
h2 = 2.0 * h
x = x1 + h
while x < x2 :
s1 += fun(x)
x += h2
x = x1 + h2
while x < x2 - h :
s2 += fun(x)
x += h2
s = h * (fun(x1) + fun(x2) + 4.0 * s1 + 2.0 * s2) / 3.0
return s;
############################################
# シンプソン則
# coded by Y.Suganuma
############################################
# 関数値の計算
def snx(x) :
return sin(x)
# 計算
pi2 = 0.5 * pi
y = simpson(0.0, pi2, 100, snx)
print("result " + str(y))
/****************************/
/* シンプソン則 */
/* coded by Y.Suganuma */
/****************************/
using System;
class Program
{
static void Main()
{
Test1 ts = new Test1();
}
}
class Test1
{
public Test1()
{
double y = simpson(0.0, 0.5*Math.PI, 100, snx);
Console.WriteLine("result " + y);
}
// 関数値の計算
double snx(double x)
{
return Math.Sin(x);
}
/**********************************/
/* 数値積分(シンプソン則) */
/* x1 : 下限 */
/* x2 : 上限 */
/* n : 分割数 */
/* fn : 関数値を計算する関数 */
/* return : 積分値 */
/**********************************/
double simpson(double x1, double x2, int n, Func<double, double> fn)
{
double h = (x2 - x1) / n;
double h2 = 2.0 * h;
double s1 = 0.0;
for (double x = x1+h; x < x2; x += h2)
s1 += fn(x);
double s2 = 0.0;
for (double x = x1+h2; x < x2-h; x += h2)
s2 += fn(x);
double s = h * (fn(x1) + fn(x2) + 4.0 * s1 + 2.0 * s2) / 3.0;
return s;
}
}
''''''''''''''''''''''''''''
' シンプソン則 '
' coded by Y.Suganuma '
''''''''''''''''''''''''''''
Module Test
Sub Main()
' 関数値の計算(ラムダ式)
Dim snx = Function(x) As Double
Return Math.Sin(x)
End Function
' 実行
Dim y As Double = simpson(0.0, 0.5*Math.PI, 100, snx)
Console.WriteLine("result " & y)
End Sub
''''''''''''''''''''''''''''''''''
' 数値積分(シンプソン則) '
' x1 : 下限 '
' x2 : 上限 '
' n : 分割数 '
' fn : 関数値を計算する関数 '
' return : 積分値 '
''''''''''''''''''''''''''''''''''
Function simpson(x1 As Double, x2 As Double, n As Integer, fn As Func(Of Double, Double))
Dim h As Double = (x2 - x1) / n
Dim h2 As Double = 2.0 * h
Dim s1 As Double = 0.0
For x As Double = x1+h To x2+1.0e-10 Step h2
s1 += fn(x)
Next
Dim s2 As Double = 0.0
For x As Double = x1+h2 To x2-h+1.0e-10 Step h2
s2 += fn(x)
Next
Dim s As Double = h * (fn(x1) + fn(x2) + 4.0 * s1 + 2.0 * s2) / 3.0
Return s
End Function
End Module
| 情報学部 | 菅沼ホーム | 目次 | 索引 |