我正在嘗試在 C 中計算積分,并且我正在嘗試使用辛普森的 3/8 規則(也稱為辛普森的第二條規則)來計算它。我寫了一個程式,但它給出了錯誤的結果。當我在紙上使用相同的規則時,它可以作業。我不知道怎么了。
辛普森一家.cpp:
#include <iostream>
double f(int x) {
return 3*(x*x) 2*x 5;
}
float integralf(int lower_end, int high_end) {
int a = lower_end;
int b = high_end;
double area = 0.0;
area = ((b - a)/8)*(f(a) 3*f((2*a b)/3) 3*f((a 2*b)/3) f(b));
return area;
}
int main() {
int lower = -3;
int high = 5;
std::cout << integralf(lower, high) << std::endl;
return 0;
}
它給出了 194,但答案是 208。我用 Reimann sum 技術嘗試了相同的積分,它給出了 166.24。
賴曼.cpp:
#include <iostream>
double f(int x) {
return 3*(x*x) 2*x 5;
}
double integral(double low_end, double high_end, double steps) {
double step = (high_end - low_end)/steps;
double area = 0.0;
double y = 0;
double x = 0;
for(int i=0;i<=steps; i) {
x = low_end i * step;
y = f(x);
area = y * step;
}
return area;
}
int main() {
int low_end = -3;
int high_end = 5;
int steps = 100;
std::cout << integral(low_end, high_end, steps) << std::endl;
return 0;
}
我不知道出了什么問題。有沒有更好的方法來計算cpp中的積分?歡迎任何建議。
解決方案
編輯:我做到了。最終版本的代碼(simpsons.cpp):
#include <iostream>
double f(double x) {
return 3*(x*x) 2*x 5;
}
float integralf(double lower_end, double high_end) {
double a = lower_end;
double b = high_end;
double h = (b - a)/3;
double area = 0.0;
area = ((3*h)/8)*(f(a) 3*f((2*a b)/3) 3*f((a 2*b)/3) f(b));
return area;
}
int main() {
int lower = -3;
int high = 5;
std::cout << integralf(lower, high) << std::endl;
return 0;
}
它給出了答案 208。
uj5u.com熱心網友回復:
最終版本的代碼(simpsons.cpp):
#include <iostream>
double f(double x) {
return 3*(x*x) 2*x 5;
}
float integralf(double lower_end, double high_end) {
double a = lower_end;
double b = high_end;
double h = (b - a)/3;
double area = 0.0;
area = ((3*h)/8)*(f(a) 3*f((2*a b)/3) 3*f((a 2*b)/3) f(b));
return area;
}
int main() {
int lower = -3;
int high = 5;
std::cout << integralf(lower, high) << std::endl;
return 0;
}
它給出了答案 208。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/443732.html
上一篇:python中的曲線擬合反函式
