PDA

View Full Version : مشکل در پیاده سازی یه قضیه ریاضی



behbud
جمعه 10 آذر 1391, 19:01 عصر
میخوام قضیه میانگین رو پیاده کنم.
(قضیه مقدار میانگین: اگه یه بازه داشته باشیم که ضرب مقادیر اونها توی تابع منفی باشه این تابع حتما یه ریشه توی اون بازه داره)
اول باید تابع رو بگیرم.
دو تا عدد هم به عنوان ابتدا و انتهای بازه میگیریم.
مقدارهای به دست اومده رو ضرب میکنیم.
اگه هر دو مثبت یا هر دو منفی بودن بازه رو عوض میکنیم.(چطوری؟ هم ابتدا و هم انتها یا هر دو؟)
اگه یکی مثبت و دیگری منفی باشه بازه رو کوچکتر میکنیم.(چطوری؟)

بازه رو باید انقد کوچیکش بکنیم که جواب به صورت تقریبی بین دو مقدار اول و اخر بازه باشه.

مسعود اقدسی فام
جمعه 10 آذر 1391, 19:55 عصر
اولا که این روش تنصیف برای به دست آوردن ریشه‌ی تقریبی تابع هستش و از قضیه‌ی مقدار میانگین استفاده می‌کنی!

وقتی اون بازه نیست (یعنی حاصلضرب مثبته) خب می‌تونی از یه طرف یا از هر دو طرف بزرگتر یا کوچکتر کنی بازه رو. اختیار با خودته. می‌تونی حتی منتقل کنی. ولی خب باز ببین استاد نظرش کدومه.

جستجوی دودویی رو خوندی؟ چطوری دنبال عدد می‌گردیم و بازه رو نصف می‌کنیم؟ همونجوری نصف کن. وسط بازه رو با جمع دو طرف بازه تقسیم بر دو به دست بیار. اسمش رو n بذاریم ( f( m رو حساب کن. بعد این f رو مثل اول ضرب در f‌ دو طرف کن. یه طرف مثبت می‌شه که ولش کن. یه طرف منفی می‌شه که همون بازه جدیده. این کارا براش تکرار می‌شه تا اختلاف سر و ته بازه از یه حدی کوجکتر شه.

hadi0x7c7
شنبه 11 آذر 1391, 12:09 عصر
اینجا من یه مثال کاملشو حل کردم:
http://barnamenevis.org/showthread.php?360253-%D8%B3%D9%88%D8%A7%D9%84-%DA%86%DB%8C-%D9%85%DB%8C-%D8%AE%D8%A7%D8%AF%D8%9F&p=1589517#post1589517

behbud
شنبه 11 آذر 1391, 19:51 عصر
ممنون از دوستان
اینو نوشتم ولی جواب نمیده.
#include "stdafx.h"
#include<iostream>
#include<math.h>
#include<conio.h>
using namespace std;
#define eps (0.00001)
// solve x^2+xcos(x)
double f(double);
int main()
{
double max,min,m;
printf("Enter max:");
scanf_s("%d", &max) ;
printf("Enter min:");
scanf_s("%d", &min) ;
if(f(min)*f(max)>=0){
printf("Enter another number for max:");
scanf_s("%d", &max) ;//
}

else if (f(min)*f(max)<0){
while (abs(min-max)>eps){

m=(min+max)/2;
if (f(m)*f(min)<0){
min=m;
max=min;
}
else if (f(m)*f(max)<0){
min=m;
}
return m;
}


}


}
double f(double x)
{
return(x*x+cos(x));
}

مسعود اقدسی فام
شنبه 11 آذر 1391, 19:56 عصر
وقتی m در min منفی می‌شه یعنی بین اون دو تاست. پس min عوض نمی‌شه و max مقدار m رو می‌گیره. یعنی بازه رو با کم کردن max به m نصف کردیم. کلا اشتباه نوشته شده. همونطور در مورد حالتی که max و m منفی می‌شه. min می‌یاد m می‌شه و max عوض نمی‌شه. این رو درست نوشتید.

اون m رو کجا return می‌کنید؟ مگه از تابع اصلی خارح شدید که نتیجه بر می‌گردونید؟

اون else if اول هم معنی نداره. چون اگه max دوباره وارد بشه چون وارد if بالا شده این else if‌ اصلا چک نمی‌شه. پس اگه بازه اشتباه باشه اصلا برنامه کار نمی‌کنه.

behbud
شنبه 11 آذر 1391, 19:59 عصر
چیکار کنم یه بازه جدید رو بگیره و دوباره کار کنه؟

مسعود اقدسی فام
شنبه 11 آذر 1391, 20:40 عصر
یه حلقه بذار و تا بازه درست وارد نکرده تکرارش کن. بعد که تموم شد اینیکی حلقه شروع شه.