所以,我对微积分和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()
更准确,因为它具有原始正弦函数的周期性(