برنامه‌ای به زبان C++ بنویسید که انتگرال عددی تابع f(x)=sin(x*x) را روی بازه [a,b] با استفاده از روش ذوزنقه‌ای (trapezoidal rule) و با تقسیم‌بندی به n قسمت محاسبه کند و نتیجه را چاپ نماید.

17.0 بازدید آخرین ویرایش در 198 روز قبل ساعت 01:47

0.0

برای حل، از فرمول ذوزنقه‌ای استفاده کنید: h=(b-a)/n، سپس مقدار تابع در نقاط میانی را جمع کرده و نتیجه را به صورت h*( (f(a)+f(b))/2 + Σ f(a+i*h) ) محاسبه کنید. در C++ از نوع double و تابع sin از استفاده کنید، پارامترها را از ورودی بخوانید و از حلقه for برای جمع‌زدن مقادیر بهره ببرید. نکته‌های عملکردی: از پیش‌محاسبه کردن h و اجتناب از محاسبات تکراری جلوگیری کنید، در صورت نیاز می‌توانید با فعال‌سازی بهینه‌سازی کامپایلر (مثلاً -O2) یا استفاده از OpenMP حلقه را موازی کنید تا در مسائل بزرگ‌تر سرعت افزایش یابد.

توسط پژوهشگر در 198 روز قبل ساعت 01:47
دسته بندی ها: C Plus Plus C Plus Plus for beginner
arman در 198 روز قبل ساعت 01:48

نکته فنی: h را یک‌بار محاسبه کرده و در حلقه به جای ضرب دوباره از یک متغیر x که با افزودن h بروز می‌شود استفاده کنید تا هزینه و خطای گردشدگی کاهش یابد. برای دقت بهتر می‌توانید جمع را با الگوریتم Kahan انجام دهید یا در موارد حساس از long double بهره ببرید، چون f(x)=sin(x*x) در مقادیر بزرگ x نوسانات شدید دارد و نیاز به n بزرگ یا روش‌های تطبیقی دارد. اگر محاسبات سنگین است، فعال‌سازی بهینه‌ساز کامپایلر (مثلاً -O2) یا موازی‌سازی حلقه با OpenMP می‌تواند سرعت را به‌طور چشمگیری افزایش دهد. همچنین مطمئن شوید از <cmath> و تابع sin به‌درستی استفاده کنید و ورودی‌ها را اعتبارسنجی کنید (مثلاً n>0 و a<=b).

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری