最近对数值分析比较感兴趣,就把王能超先生的《数值分析简明教程》(第二版)拜读了下。编程中最没用的东西是源代码,最有用的东西是算法和数据结构。
闲话不多说,po代码,让自己能有个记忆
1.秦九韶算法
#include <iostream>
#define IndexMaxLength 100
using namespace std;
int main(void)
{
float a[IndexMaxLength], x, v;//a[]是各项的系数
int i, n, k;
cout << "含x的项的个数: ";
cin >> n;
cout << "x的值为: ";
cin >> x;
for (i = 0; i <= n; i++)
{
cout << "各项的系数a[" << i << "]: ";
cin >> a[i];
}
v = a[n];
k = 1;
do
{
v = x*v + a[n - k];
k = k + 1;
} while (k <= n);
cout << "运算结果: " << v << endl;
system("pause");
return 0;
}
2.拉格朗日插值公式
#include <iostream>
#include <cmath>
#define IndexMaxLength 100
using namespace std;
int main(void)
{
float a, b, t, x[IndexMaxLength], y[IndexMaxLength];//a 即所求点的横坐标,b为纵坐标
int n, i, j, k;
cout << "a = ";
cin >> a;
cout << "n = ";
cin >> n;
for (i = 0; i <= n; i++)
{
cout << "x[" << i << "]: ";
cin >> x[i];
cout << "y[" << i << "]: ";
cin >> y[i];
}
k = 0;
b = 0;
for (k = 0; k <= n; k++)
{
t = 1;
for (j = 0; j <= n; j++)
{
if (j != k)
t = t*(a - x[j]) / (x[k] - x[j]);
}
b = b + t*y[k];
}
cout << "b = " << b;
system("pause");
return 0;
}
再来一发,改进的欧拉公式:
“`
include
include
using namespace std;
float fun(float, float);
int main(void)
{
float x0, y0, h, x1, y1, yp, yc;
/*
h:步长
N:步数
x0、y0为”老值“
x1、y1为”新值“ 即本步计算结果
*/
int N, n;
cout << “======请输入初值=======” << endl;
cout << “x0 = “;
cin >> x0;
cout << “y0 = “;
cin >> y0;
cout << “h = “;
cin >> h;
cout << “N = “;
cin >> N;
for (n = 1; n <= N; n++)
{
x1 = x0 + h;
yp = y0 + h*fun(x0, y0);
yc = y0 + h*fun(x1, yp);
y1 = ((float)1 / 2)*(yp + yc);//查了好久,强制转换啊!!!
cout << “yp = ” << yp << endl;
cout << “yc = ” << yc << endl;
cout << “x1 = ” << x1 << endl;
cout << “y1 = ” << y1 << endl;
x0 = x1;
y0 = y1;
}
system("pause");
return 0;
}
float fun(float a, float b)
{
float m;
m = b - 2 * a / b;
return(m);
}
4.经典四阶龙格库塔方法
`#include
include
using namespace std;
float fun(float, float);
int main(void)
{
float x0, y0, x1, y1, K1, K2, K3, K4, h;
int N, n;
cout << “======请输入初值=======” << endl;
cout << “x0 = “;
cin >> x0;
cout << “y0 = “;
cin >> y0;
cout << “h = “;
cin >> h;
cout << “N = “;
cin >> N;
for (n = 1; n <= N; n++)
{
cout << “===================” << endl;
x1 = x0 + h;
K1 = fun(x0, y0);
K2 = fun(x0 + (h / 2), y0 + (h / 2) * K1);
K3 = fun(x0 + (h / 2), y0 + (h / 2) * K2);
K4 = fun(x1, y0 + h * K3);
y1 = y0 + (h / 6) * (K1 + 2 * K2 + 2 * K3 + K4);
cout << “x1 = ” << x1 << endl;
cout << “y1 = ” << y1 << endl;
x0 = x1;
y0 = y1;
}
system("pause");
return 0;
}
float fun(float a, float b)
{
float m;
m = b - 2 * a / b;
return(m);
}`