📜流体力学电磁学运动学动力学化学和电路中欧拉法
📜流体力学电磁学运动学动力学化学和电路中欧拉法示例:Python重力弹弓流体晃动微分方程模型和交直流电阻电容电路
 
✒️多语言实现欧拉法和修正欧拉法
在数学和计算科学中,欧拉方法(也称为前向欧拉方法)是一种用于求解具有给定初值的常微分方程的一阶数值程序。考虑一个微分方程  
     
      
       
       
         d 
        
       
         y 
        
       
         / 
        
       
         d 
        
       
         x 
        
       
         = 
        
       
         f 
        
       
         ( 
        
       
         x 
        
       
         , 
        
       
         y 
        
       
         ) 
        
       
      
        d y / d x=f(x, y) 
       
      
    dy/dx=f(x,y),初始条件为  
     
      
       
       
         y 
        
       
         ( 
        
       
         x 
        
       
         0 
        
       
         ) 
        
       
         = 
        
       
         y 
        
       
         0 
        
       
      
        y(x 0)=y 0 
       
      
    y(x0)=y0,则该方程的逐次逼近可由下式给出:
  
      
       
        
        
          y 
         
        
          ( 
         
        
          n 
         
        
          + 
         
        
          1 
         
        
          ) 
         
        
          = 
         
        
          y 
         
        
          ( 
         
        
          n 
         
        
          ) 
         
        
          + 
         
        
          h 
         
        
          ∗ 
         
        
          f 
         
        
          ( 
         
        
          x 
         
        
          ( 
         
        
          n 
         
        
          ) 
         
        
          , 
         
        
          y 
         
        
          ( 
         
        
          n 
         
        
          ) 
         
        
          ) 
         
        
       
         y(n+1)=y(n)+h * f(x(n), y(n)) 
        
       
     y(n+1)=y(n)+h∗f(x(n),y(n))
 其中  
     
      
       
       
         h 
        
       
         = 
        
       
         ( 
        
       
         x 
        
       
         ( 
        
       
         n 
        
       
         ) 
        
       
         − 
        
       
         x 
        
       
         ( 
        
       
         0 
        
       
         ) 
        
       
         ) 
        
       
         / 
        
       
         n 
        
       
      
        h=(x(n)-x(0)) / n 
       
      
    h=(x(n)−x(0))/n, $h $表示步长。选择较小的  
     
      
       
       
         h 
        
       
      
        h 
       
      
    h 值会导致更准确的结果和更多的计算时间。
例如,考虑微分方程 d y / d x = ( x + y + x y ) d y / d x=(x+y+x y) dy/dx=(x+y+xy),初始条件为 y ( 0 ) = 1 y (0)=1 y(0)=1,步长为 h = 0.025 h =0.025 h=0.025。求 y ( 0.1 ) y(0.1) y(0.1)。
解: f ( x , y ) = ( x + y + x y ) f(x, y)=(x+y+x y) f(x,y)=(x+y+xy)
x 0 = 0 , y 0 = 1 , h = 0.025 x 0=0, y 0=1, h=0.025 x0=0,y0=1,h=0.025
现在我们可以使用欧拉公式计算  
     
      
       
        
        
          y 
         
        
          1 
         
        
       
      
        y_1 
       
      
    y1
  
      
       
        
         
          
           
            
           
          
          
           
            
             
             
             
               y 
              
             
               1 
              
             
            
              = 
             
            
              y 
             
            
              0 
             
            
              + 
             
            
              h 
             
            
              ∗ 
             
            
              f 
             
            
              ( 
             
            
              x 
             
            
              0 
             
            
              , 
             
            
              y 
             
            
              0 
             
            
              ) 
             
            
           
          
         
         
          
           
            
           
          
          
           
            
             
             
             
               y 
              
             
               1 
              
             
            
              = 
             
            
              1 
             
            
              + 
             
            
              0.025 
             
            
              ∗ 
             
            
              ( 
             
            
              0 
             
            
              + 
             
            
              1 
             
            
              + 
             
            
              0 
             
            
              ∗ 
             
            
              1 
             
            
              ) 
             
            
           
          
         
         
          
           
            
           
          
          
           
            
             
             
             
               y 
              
             
               1 
              
             
            
              = 
             
            
              1.025 
             
            
           
          
         
         
          
           
            
           
          
          
           
            
             
            
              y 
             
            
              ( 
             
            
              0.025 
             
            
              ) 
             
            
              = 
             
            
              1.025. 
             
            
           
          
         
        
       
         \begin{aligned} & y_1=y 0+h * f(x 0, y 0) \\ & y_1=1+0.025 *(0+1+0 * 1) \\ & y_1=1.025 \\ & y(0.025)=1.025 . \end{aligned} 
        
       
     y1=y0+h∗f(x0,y0)y1=1+0.025∗(0+1+0∗1)y1=1.025y(0.025)=1.025.
 类似地我们可以计算  
     
      
       
       
         y 
        
       
         ( 
        
       
         0.050 
        
       
         ) 
        
       
         , 
        
       
         y 
        
       
         ( 
        
       
         0.075 
        
       
         ) 
        
       
         , 
        
       
         … 
        
       
      
        y(0.050), y(0.075), \ldots 
       
      
    y(0.050),y(0.075),…  
     
      
       
       
         y 
        
       
         ( 
        
       
         0.1 
        
       
         ) 
        
       
      
        y(0.1) 
       
      
    y(0.1)
y ( 0.1 ) = 1.11167 y(0.1)=1.11167 y(0.1)=1.11167
Python实现:
def func( x, y ):
	return (x + y + x * y)
	
def euler( x0, y, h, x ):
	temp = -0
	while x0 < x:
		temp = y
		y = y + h * func(x0, y)
		x0 = x0 + h
	print("Approximate solution at x = ", x, " is ", "%.6f"% y)
	
x0 = 0
y0 = 1
h = 0.025
x = 0.1
euler(x0, y0, h, x)
C++实现:
#include <iostream>
using namespace std;
float func(float x, float y)
{
	return (x + y + x * y);
}
void euler(float x0, float y, float h, float x)
{
	float temp = -0;
	while (x0 < x) {
		temp = y;
		y = y + h * func(x0, y);
		x0 = x0 + h;
	}
	cout << "Approximate solution at x = "
		<< x << " is " << y << endl;
}
int main()
{
	float x0 = 0;
	float y0 = 1;
	float h = 0.025;
	float x = 0.1;
	euler(x0, y0, h, x);
	return 0;
}
C#实现:
using System;
class GFG {
	static float func(float x, float y)
	{
		return (x + y + x * y);
	}
	static void euler(float x0, float y, float h, float x)
	{
		while (x0 < x) {
			y = y + h * func(x0, y);
			x0 = x0 + h;
		}
		Console.WriteLine("Approximate solution at x = "
						+ x + " is " + y);
	}
	public static void Main()
	{
		float x0 = 0;
		float y0 = 1;
		float h = 0.025f;
		float x = 0.1f;
		euler(x0, y0, h, x);
	}
}
Java实现:
import java.io.*;
class Euler {
	float func(float x, float y)
	{
		return (x + y + x * y);
	}
	void euler(float x0, float y, float h, float x)
	{
		float temp = -0;
		while (x0 < x) {
			temp = y;
			y = y + h * func(x0, y);
			x0 = x0 + h;
		}
		System.out.println("Approximate solution at x = "
						+ x + " is " + y);
	}
	public static void main(String args[]) throws IOException
	{
		Euler obj = new Euler();
		float x0 = 0;
		float y0 = 1;
		float h = 0.025f;
		float x = 0.1f;
		obj.euler(x0, y0, h, x);
	}
}
JavaScript实现:
<script>
	function func(x, y)
	{
		return (x + y + x * y);
	}
	function euler(x0, y, h, x)
	{
		let temp = -0;
		while (x0 < x) {
			temp = y;
			y = y + h * func(x0, y);
			x0 = x0 + h;
		}
		document.write("Approximate solution at x = "
						+ x + " is " + y);
	}
	let x0 = 0;
	let y0 = 1;
	let h = 0.025;
	let x = 0.1;
	euler(x0, y0, h, x);
</script>
预测校正器或修正欧拉法
Python实现
def f(x, y):
	v = y - 2 * x * x + 1;
	return v;
def predict(x, y, h):
	
	y1p = y + h * f(x, y);
	return y1p;
def correct(x, y, x1, y1, h):
	
	e = 0.00001;
	y1c = y1;
	while (abs(y1c - y1) > e + 1):
		y1 = y1c;
		y1c = y + 0.5 * h * (f(x, y) + f(x1, y1));
	return y1c;
def printFinalValues(x, xn, y, h):
	while (x < xn):
		x1 = x + h;
		y1p = predict(x, y, h);
		y1c = correct(x, y, x1, y1p, h);
		x = x1;
		y = y1c;
	print("The final value of y at x =",
					int(x), "is :", y);
if __name__ == '__main__':
	x = 0; y = 0.5;
	xn = 1;
	h = 0.2;
	printFinalValues(x, xn, y, h);
C++实现
#include <bits/stdc++.h>
using namespace std;
double f(double x, double y)
{
	double v = y - 2 * x * x + 1;
	return v;
}
double predict(double x, double y, double h)
{
	double y1p = y + h * f(x, y);
	return y1p;
}
double correct(double x, double y,
			double x1, double y1,
			double h)
{
	double e = 0.00001;
	double y1c = y1;
	do {
		y1 = y1c;
		y1c = y + 0.5 * h * (f(x, y) + f(x1, y1));
	} while (fabs(y1c - y1) > e);
	return y1c;
}
void printFinalValues(double x, double xn,
					double y, double h)
{
	while (x < xn) {
		double x1 = x + h;
		double y1p = predict(x, y, h);
		double y1c = correct(x, y, x1, y1p, h);
		x = x1;
		y = y1c;
	}
	cout << "The final value of y at x = "
		<< x << " is : " << y << endl;
}
int main()
{
	double x = 0, y = 0.5;
	double xn = 1;
	double h = 0.2;
	printFinalValues(x, xn, y, h);
	return 0;
}
C#实现
using System;
class GFG
{
	
static double f(double x, double y)
{
	double v = y - 2 * x * x + 1;
	return v;
}
static double predict(double x, double y, double h)
{
	double y1p = y + h * f(x, y);
	return y1p;
}
static double correct(double x, double y,
			double x1, double y1,
			double h)
{
	double e = 0.00001;
	double y1c = y1;
	do
	{
		y1 = y1c;
		y1c = y + 0.5 * h * (f(x, y) + f(x1, y1));
	}
	while (Math.Abs(y1c - y1) > e);
	return y1c;
}
static void printFinalValues(double x, double xn,
					double y, double h)
{
	while (x < xn) 
	{
		double x1 = x + h;
		double y1p = predict(x, y, h);
		double y1c = correct(x, y, x1, y1p, h);
		x = x1;
		y = y1c;
	}
	Console.WriteLine("The final value of y at x = "+
						x + " is : " + Math.Round(y, 5));
}
static void Main()
{
	double x = 0, y = 0.5;
	double xn = 1;
	double h = 0.2;
	printFinalValues(x, xn, y, h);
}
}
Java实现
import java.text.*;
class GFG
{
static double f(double x, double y)
{
	double v = y - 2 * x * x + 1;
	return v;
}
static double predict(double x, double y, double h)
{
	double y1p = y + h * f(x, y);
	return y1p;
}
static double correct(double x, double y,
					double x1, double y1,
					double h)
{
	double e = 0.00001;
	double y1c = y1;
	do
	{
		y1 = y1c;
		y1c = y + 0.5 * h * (f(x, y) + f(x1, y1));
	}
	while (Math.abs(y1c - y1) > e);
	return y1c;
}
static void printFinalValues(double x, double xn,
					double y, double h)
{
	while (x < xn) 
	{
		double x1 = x + h;
		double y1p = predict(x, y, h);
		double y1c = correct(x, y, x1, y1p, h);
		x = x1;
		y = y1c;
	}
	DecimalFormat df = new DecimalFormat("#.#####");
	System.out.println("The final value of y at x = "+
						x + " is : "+df.format(y));
}
public static void main (String[] args) 
{
	double x = 0, y = 0.5;
	double xn = 1;
	double h = 0.2;
	printFinalValues(x, xn, y, h);
}
}
JavaScript实现
<script>
	function f(x , y) {
		var v = y - 2 * x * x + 1;
		return v;
	}
	function predict(x , y , h) {
		var y1p = y + h * f(x, y);
		return y1p;
	}
	function correct(x , y , x1 , y1 , h) {
		var e = 0.00001;
		var y1c = y1;
		do {
			y1 = y1c;
			y1c = y + 0.5 * h * (f(x, y) + f(x1, y1));
		} while (Math.abs(y1c - y1) > e);
		return y1c;
	}
	function printFinalValues(x , xn , y , h) {
		while (x < xn) {
			var x1 = x + h;
			var y1p = predict(x, y, h);
			var y1c = correct(x, y, x1, y1p, h);
			x = x1;
			y = y1c;
		}
		document.write("The final value of y at x = " + x + " is : " + y.toFixed(5));
	}
		var x = 0, y = 0.5;
		var xn = 1;
		var h = 0.2;
		printFinalValues(x, xn, y, h);
</script>














![[package-view] RegisterGUI.java-自用](https://img-blog.csdnimg.cn/direct/a12192545cee41cd802e9acdc9c23510.png)




