| 情報学部 | 菅沼ホーム | 目次 | 索引 |
/****************************/
/* 補間法(ラグランジュ) */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
double Lagrange(int, double *, double *, double);
int main()
{
double x[3], x1, y[3], y1;
int i1, n;
// 線形補間
n = 1;
x[0] = 0.0;
x[1] = 2.0;
y[0] = 0.0;
y[1] = 4.0;
printf("線形補間\n");
x1 = 0.0;
for (i1 = 0; i1 <= 8; i1++) {
y1 = Lagrange(n, x, y, x1);
printf(" x %f y %f\n", x1, y1);
x1 += 0.25;
}
// 2次補間
n = 2;
x[0] = 0.0;
x[1] = 1.0;
x[2] = 2.0;
y[0] = 0.0;
y[1] = 1.0;
y[2] = 4.0;
printf("2次補間\n");
x1 = 0.0;
for (i1 = 0; i1 <= 8; i1++) {
y1 = Lagrange(n, x, y, x1);
printf(" x %f y %f\n", x1, y1);
x1 += 0.25;
}
return 0;
}
/**********************************/
/* ラグランジュ補間法 */
/* n : 次数(n=1は線形補間) */
/* x, y : (n+1)個の点の座標 */
/* x1 : 補間したい点のx座標 */
/* return : 補間結果 */
/**********************************/
double Lagrange(int n, double *x, double *y, double x1)
{
double s1, s2, y1 = 0.0;
int i1, i2;
for (i1 = 0; i1 <= n; i1++) {
s1 = 1.0;
s2 = 1.0;
for (i2 = 0; i2 <= n; i2++) {
if (i2 != i1) {
s1 *= (x1 - x[i2]);
s2 *= (x[i1] - x[i2]);
}
}
y1 += y[i1] * s1 / s2;
}
return y1;
}
/****************************/
/* 補間法(ラグランジュ) */
/* coded by Y.Suganuma */
/****************************/
import java.io.*;
public class Test {
public static void main(String args[]) throws IOException
{
double x[], x1, y[], y1;
int i1, n;
x = new double [3];
y = new double [3];
// 線形補間
n = 1;
x[0] = 0.0;
x[1] = 2.0;
y[0] = 0.0;
y[1] = 4.0;
System.out.println("線形補間");
x1 = 0.0;
for (i1 = 0; i1 <= 8; i1++) {
y1 = lagrange(n, x, y, x1);
System.out.println(" x " + x1 + " y " + y1);
x1 += 0.25;
}
// 2次補間
n = 2;
x[0] = 0.0;
x[1] = 1.0;
x[2] = 2.0;
y[0] = 0.0;
y[1] = 1.0;
y[2] = 4.0;
System.out.println("2次補間\n");
x1 = 0.0;
for (i1 = 0; i1 <= 8; i1++) {
y1 = lagrange(n, x, y, x1);
System.out.println(" x " + x1 + " y " + y1);
x1 += 0.25;
}
}
/**********************************/
/* ラグランジュ補間法 */
/* n : 次数(n=1は線形補間) */
/* x, y : (n+1)個の点の座標 */
/* x1 : 補間したい点のx座標 */
/* return : 補間結果 */
/**********************************/
static double lagrange(int n, double x[], double y[], double x1)
{
double s1, s2, y1 = 0.0;
int i1, i2;
for (i1 = 0; i1 <= n; i1++) {
s1 = 1.0;
s2 = 1.0;
for (i2 = 0; i2 <= n; i2++) {
if (i2 != i1) {
s1 *= (x1 - x[i2]);
s2 *= (x[i1] - x[i2]);
}
}
y1 += y[i1] * s1 / s2;
}
return y1;
}
}
<!DOCTYPE HTML>
<HTML>
<HEAD>
<TITLE>補間法(ラグランジュ)</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
<SCRIPT TYPE="text/javascript">
function main()
{
// データの設定
let n = parseInt(document.getElementById("order").value);
let sp = parseFloat(document.getElementById("step").value);
let x = new Array();
let y = new Array();
let s = (document.getElementById("data").value).split(/ {1,}|\n{1,}/);
let k = 0;
for (let i1 = 0; i1 < 2*(n+1); i1 += 2) {
x[k] = parseFloat(s[i1]);
y[k] = parseFloat(s[i1+1]);
k++;
}
// 出力
let str = "";
let x1 = x[0];
while (x1 < x[n]+0.01*sp) {
let y1 = lagrange(n, x, y, x1);
str = str + "x " + x1 + " y " + y1 + "\n";
x1 += sp;
}
document.getElementById("ans").value = str;
}
/**********************************/
/* ラグランジュ補間法 */
/* n : 次数(n=1は線形補間) */
/* x, y : (n+1)個の点の座標 */
/* x1 : 補間したい点のx座標 */
/* return : 補間結果 */
/**********************************/
function lagrange(n, x, y, x1)
{
let s1;
let s2;
let y1 = 0.0;
let i1;
let i2;
for (i1 = 0; i1 <= n; i1++) {
s1 = 1.0;
s2 = 1.0;
for (i2 = 0; i2 <= n; i2++) {
if (i2 != i1) {
s1 *= (x1 - x[i2]);
s2 *= (x[i1] - x[i2]);
}
}
y1 += y[i1] * s1 / s2;
}
return y1;
}
</SCRIPT>
</HEAD>
<BODY STYLE="font-size: 130%; background-color: #eeffee;">
<H2 STYLE="text-align:center"><B>補間法(ラグランジュ)</B></H2>
<DL>
<DT> テキストフィールドおよびテキストエリアには,例として,3 点 ( 0, 0 ), ( 1, 1 ), ( 2, 4 ) を使用して 2 次のラグランジュ補間を実行するための値が設定されています.他の問題を実行する場合は,それらを適切に修正してください.
</DL>
<DIV STYLE="text-align:center">
次数(n):<INPUT ID="order" STYLE="font-size: 100%" TYPE="text" SIZE="2" VALUE="2">
ステップ:<INPUT ID="step" STYLE="font-size: 100%;" TYPE="text" SIZE="5" VALUE="0.25">
<BUTTON STYLE="font-size: 100%; background-color: pink" onClick="main()">OK</BUTTON><BR><BR>
データ(x y,(n+1)個):<TEXTAREA ID="data" COLS="30" ROWS="15" STYLE="font-size: 100%">0.0 0.0
1.0 1.0
2.0 4.0</TEXTAREA><BR><BR>
<TEXTAREA ID="ans" COLS="50" ROWS="15" STYLE="font-size: 100%"></TEXTAREA>
</DIV>
</BODY>
</HTML>
<?php
/****************************/
/* 補間法(ラグランジュ) */
/* coded by Y.Suganuma */
/****************************/
$x = array(3);
$y = array(3);
// 線形補間
$n = 1;
$x[0] = 0.0;
$x[1] = 2.0;
$y[0] = 0.0;
$y[1] = 4.0;
printf("線形補間\n");
$x1 = 0.0;
for ($i1 = 0; $i1 <= 8; $i1++) {
$y1 = Lagrange($n, $x, $y, $x1);
printf(" x %f y %f\n", $x1, $y1);
$x1 += 0.25;
}
// 2次補間
$n = 2;
$x[0] = 0.0;
$x[1] = 1.0;
$x[2] = 2.0;
$y[0] = 0.0;
$y[1] = 1.0;
$y[2] = 4.0;
printf("2次補間\n");
$x1 = 0.0;
for ($i1 = 0; $i1 <= 8; $i1++) {
$y1 = Lagrange($n, $x, $y, $x1);
printf(" x %f y %f\n", $x1, $y1);
$x1 += 0.25;
}
/**********************************/
/* ラグランジュ補間法 */
/* n : 次数(n=1は線形補間) */
/* x, y : (n+1)個の点の座標 */
/* x1 : 補間したい点のx座標 */
/* return : 補間結果 */
/**********************************/
function Lagrange($n, $x, $y, $x1)
{
$y1 = 0.0;
for ($i1 = 0; $i1 <= $n; $i1++) {
$s1 = 1.0;
$s2 = 1.0;
for ($i2 = 0; $i2 <= $n; $i2++) {
if ($i2 != $i1) {
$s1 *= ($x1 - $x[$i2]);
$s2 *= ($x[$i1] - $x[$i2]);
}
}
$y1 += $y[$i1] * $s1 / $s2;
}
return $y1;
}
?>
#***************************/
# 補間法(ラグランジュ) */
# coded by Y.Suganuma */
#***************************/
#*********************************/
# ラグランジュ補間法 */
# n : 次数(n=1は線形補間) */
# x, y : (n+1)個の点の座標 */
# x1 : 補間したい点のx座標 */
# return : 補間結果 */
#*********************************/
def Lagrange(n, x, y, x1)
y1 = 0.0
for i1 in 0 ... n+1
s1 = 1.0
s2 = 1.0
for i2 in 0 ... n+1
if i2 != i1
s1 *= (x1 - x[i2])
s2 *= (x[i1] - x[i2])
end
end
y1 += y[i1] * s1 / s2
end
return y1
end
x = Array.new(3)
y = Array.new(3)
# 線形補間
n = 1
x[0] = 0.0
x[1] = 2.0
y[0] = 0.0
y[1] = 4.0
printf("線形補間\n")
x1 = 0.0
for i1 in 0 ... 9
y1 = Lagrange(n, x, y, x1)
printf(" x %f y %f\n", x1, y1)
x1 += 0.25
end
# 2次補間
n = 2
x[0] = 0.0
x[1] = 1.0
x[2] = 2.0
y[0] = 0.0
y[1] = 1.0
y[2] = 4.0
printf("2次補間\n")
x1 = 0.0
for i1 in 0 ... 9
y1 = Lagrange(n, x, y, x1)
printf(" x %f y %f\n", x1, y1)
x1 += 0.25
end
# -*- coding: UTF-8 -*-
import numpy as np
from math import *
############################################
# ラグランジュ補間法
# n : 次数(n=1は線形補間)
# x, y : (n+1)個の点の座標
# x1 : 補間したい点のx座標
# return : 補間結果
# coded by Y.Suganuma
############################################
def Lagrange(n, x, y, x1) :
y1 = 0.0
for i1 in range(0, n+1) :
s1 = 1.0
s2 = 1.0
for i2 in range(0, n+1) :
if i2 != i1 :
s1 *= (x1 - x[i2])
s2 *= (x[i1] - x[i2])
y1 += y[i1] * s1 / s2
return y1
############################################
# 補間法(ラグランジュ)
# coded by Y.Suganuma
############################################
x = np.array([0, 2, 2], np.float)
y = np.array([0, 4, 4], np.float)
# 線形補間
n = 1
print("線形補間")
x1 = 0.0
for i1 in range(0, 9) :
y1 = Lagrange(n, x, y, x1)
print(" x " + str(x1) + " y " + str(y1))
x1 += 0.25
# 2次補間
n = 2
x[1] = 1.0
y[1] = 1.0
print("2次補間")
x1 = 0.0
for i1 in range(0, 9) :
y1 = Lagrange(n, x, y, x1)
print(" x " + str(x1) + " y " + str(y1))
x1 += 0.25
/****************************/
/* 補間法(ラグランジュ) */
/* coded by Y.Suganuma */
/****************************/
using System;
class Program
{
static void Main()
{
Test1 ts = new Test1();
}
}
class Test1
{
public Test1()
{
double[] x = new double [3];
double[] y = new double [3];
// 線形補間
int n = 1;
x[0] = 0.0;
x[1] = 2.0;
y[0] = 0.0;
y[1] = 4.0;
Console.WriteLine("線形補間");
double x1 = 0.0;
for (int i1 = 0; i1 <= 8; i1++) {
double y1 = lagrange(n, x, y, x1);
Console.WriteLine(" x " + x1 + " y " + y1);
x1 += 0.25;
}
// 2次補間
n = 2;
x[0] = 0.0;
x[1] = 1.0;
x[2] = 2.0;
y[0] = 0.0;
y[1] = 1.0;
y[2] = 4.0;
Console.WriteLine("2次補間\n");
x1 = 0.0;
for (int i1 = 0; i1 <= 8; i1++) {
double y1 = lagrange(n, x, y, x1);
Console.WriteLine(" x " + x1 + " y " + y1);
x1 += 0.25;
}
}
/**********************************/
/* ラグランジュ補間法 */
/* n : 次数(n=1は線形補間) */
/* x, y : (n+1)個の点の座標 */
/* x1 : 補間したい点のx座標 */
/* return : 補間結果 */
/**********************************/
double lagrange(int n, double[] x, double[] y, double x1)
{
double y1 = 0.0;
for (int i1 = 0; i1 <= n; i1++) {
double s1 = 1.0;
double s2 = 1.0;
for (int i2 = 0; i2 <= n; i2++) {
if (i2 != i1) {
s1 *= (x1 - x[i2]);
s2 *= (x[i1] - x[i2]);
}
}
y1 += y[i1] * s1 / s2;
}
return y1;
}
}
''''''''''''''''''''''''''''
' 補間法(ラグランジュ) '
' coded by Y.Suganuma '
''''''''''''''''''''''''''''
Module Test
Sub Main()
Dim x(3) As Double
Dim y(3) As Double
' 線形補間
Dim n As Integer = 1
x(0) = 0.0
x(1) = 2.0
y(0) = 0.0
y(1) = 4.0
Console.WriteLine("線形補間")
Dim x1 As Double = 0.0
For i1 As Integer = 0 To 8
Dim y1 As Double = lagrange(n, x, y, x1)
Console.WriteLine(" x " & x1 & " y " & y1)
x1 += 0.25
Next
' 2次補間
n = 2
x(0) = 0.0
x(1) = 1.0
x(2) = 2.0
y(0) = 0.0
y(1) = 1.0
y(2) = 4.0
Console.WriteLine("2次補間\n")
x1 = 0.0
For i1 As Integer = 0 To 8
Dim y1 As Double = lagrange(n, x, y, x1)
Console.WriteLine(" x " & x1 & " y " & y1)
x1 += 0.25
Next
End Sub
''''''''''''''''''''''''''''''''''
' ラグランジュ補間法 '
' n : 次数(n=1は線形補間) '
' x, y : (n+1)個の点の座標 '
' x1 : 補間したい点のx座標 '
' return : 補間結果 '
''''''''''''''''''''''''''''''''''
Function lagrange(n As Integer, x() As Double, y() As Double, x1 As Double)
Dim y1 As Double = 0.0
For i1 As Integer = 0 To n
Dim s1 As Double = 1.0
Dim s2 As Double = 1.0
For i2 As Integer = 0 To n
If i2 <> i1
s1 *= (x1 - x(i2))
s2 *= (x(i1) - x(i2))
End If
Next
y1 += y(i1) * s1 / s2
Next
Return y1
End Function
End Module
| 情報学部 | 菅沼ホーム | 目次 | 索引 |