迭代法实现n阶贝塞尔函数并使用Matlab进行绘图
n阶第一类柱贝塞尔函数
n阶贝塞尔函数迭代公式
J
n
(
x
)
=
2
n
−
1
x
J
n
−
1
(
x
)
−
J
n
−
2
(
x
)
.
\it{J}_n{(x)} = \frac{\it{2n-1}}{x} \it{J}_{n-1}{(x)} - \it{J}_{n-2}{(x)}.
Jn(x)=x2n−1Jn−1(x)−Jn−2(x).
使用c++编程结果如下。
static void Besseldiedai()
{
double a = 0.0;
double b = 0.0;
double c = 0.0;
int n = 0;
double X;
cout << "定义迭代阶数:" << endl;//定义迭代阶数
cin >> n;
cout << "定义输出范围:" << endl;//定义迭代阶数
cin >> X;
for (double x = 0.1;x <= X;x = x + 0.1)
{
a = _j0(x);
b = _j1(x);
for (int i = 2;i <= n;i++)
{
c = 2 * (i - 1) * b / x - a;
a = b;
b = c;
}
cout << c << " " << _jn(n, x) << endl;
}
}
将得出的数据导入两份文件中,一份为“test.txt”用于保存使用迭代法计算的高阶贝塞尔函数,另一份为“c++.txt”用于保存c++标准库中自带的n阶贝塞尔函数,将数据导入Matlab进行绘图,
clear all;
close all;
clc;
n = 30;
test_array = load('test.txt');
test_array2 = load('c++.txt');
x = test_array(:,1);
y = test_array(:,2);
x2 = test_array2(:,1);
y2 = test_array2(:,2);
hold on
h = plot(x,y,'-',x2,y2,'o','linewidth',1);
grid on;
axis([5,50,-1,1]);
xlabel('宗量X');ylabel('Y')
title('迭代法计算n阶贝塞尔函数曲线');
legend('迭代法计算','函数库比较');
以30阶为例,可以看到,在高阶范围,迭代法计算的误差较大,但该误差会随着宗量x的取值而逐渐缩小:
![Alt](https://img-home.csdnimg.cn/images/20220524100510.png#pic_center