收敛性测试程序



所以,我对微积分和C++都很缺乏经验,所以如果我完全误解了这一点,请耐心等待。我应该测试这个泰勒级数程序的收敛性,当输出值不变时。然而,按照我的编写方式,这似乎是不可能的,因为我在实现它的同时迭代for循环。大约12之后,它对库sin((不再准确;但我不确定这是否是同一件事,因为事实似乎并非如此。关于我想要什么的建议会很好,我真的很感激。如果这个问题很愚蠢,我再次道歉!

这是我的代码:

#include <iostream>
#include<cmath>
using namespace std;

double getFactorial (double num)
{
long double factorial = 1.0;

for (int i = 1; i <= num; ++i)
{
factorial *= i;   //iterates from 1 to num value, multiplying by each number
}

return factorial;
}

double taylorSin(double num){

double value=0;

for(int i=0;i<20;i++){

value+=pow(-1.0,i)*pow(num,2*i+1)/getFactorial(2*i+1);
}
return value;
}

int main ()
{ cout<<getFactorial(6);

for(double i=1;i<=12;i++){ 
//loops through given amount of values to test function
double series=i; //assign double type variable with value of i

//cout<<"Taylor function result is "<<taylorSin(series)<<endl;
//cout<<"Library sin result is "<<sin(series)<<endl;

}
return 0;
}

根据你的回答,我编写了一个泰勒求和程序:

#include <iostream>
#include <cmath>
#include <limits>
#include <concepts>
template<typename F>
concept my_lambda = requires(F f, unsigned long long int x) {
{ f(x) } -> std::same_as<long double>;
};
template<my_lambda ftn>
long double Taylor_sum(ftn term) noexcept {
using namespace std;
long double value = 0, prev = 0;
unsigned long long int i = 0;
try {
do {
if (i == numeric_limits<unsigned long long>::max() || !isfinite(prev)) return numeric_limits<long double>::quiet_NaN();
prev = value;
value += term(i++);
} while (prev != value);
return value;
}
catch (...) { return numeric_limits<long double>::quiet_NaN(); }
};
int main() {
using namespace std;  long double x; cin >> x ;
long double series_sum = Taylor_sum([x](unsigned long long int i) -> long double { return /*Your implementation here*/; });
if (!isfinite(series_sum)) cout << "Series does not converge!" << endl;
else {
cout << "Series converged, its value is : " << series_sum << endl;
cout << "Compared to sin                : " << sinl(x) << endl;
}
return 0;
}

尽管比较术语before&求和后并不是检验收敛性的严格方法,但这种方法在实践中是常用的方法。

注意:当我对大x使用这个函数时,它与std::sin()不同,并且在x足够大时发散。这是因为浮点运算的精度有限(std::sin()更准确,因为它具有原始正弦函数的周期性(

最新更新