PDA

View Full Version : راهنمایی برای نوشتی تابغ ریاضی



NIMA_1981
شنبه 21 خرداد 1390, 13:36 عصر
سلام دوستان یک تابع دارم به این شکل
http://031.img98.net/out.php/i393662_11.png
که باید یک فانکشن بسازم که h,f(x),x را دریافت کنه و مقدار تابع را حساب کنه

حالا مشکل من این که جطوری مقدار f(x) که به این شکل هستش را به تابع وارد کنم که بتونه محاسبه کنه
http://031.img98.net/out.php/i393681_22.png

طبق فرمول ریاضی باید به این شکل حساب بشه
http://031.img98.net/out.php/i393712_33.png
البته ممکنه مقدار f(x) تغییر ‍کنه
http://031.img98.net/out.php/i393727_44.png
با تشکر

یوسف زالی
شنبه 21 خرداد 1390, 14:03 عصر
سلام.
اگر تابع شما یک تابع از پیش تعریف شده و ثابت هست به راحتی میشه پیادش کرد.
اما اگر کاربر تابع رو میده باید یک پارسر بنویسید که کلی دردسر داره.

اگر ثابت هست :


float f(float x)
{
return x * x
}


مثلا میشه X^2
تو فراخونی :


f(10)

NIMA_1981
شنبه 21 خرداد 1390, 14:21 عصر
من تو تا مقدار دارم
۱-
http://031.img98.net/out.php/i393681_22.png
۲-
http://031.img98.net/out.php/i393727_44.png
فقط من این قسمت رو نفهمیدم من یک فانکش اصلی دارم که طبق یک فرمول داره جطوری همزمان باید مقدار f(x) رو حساب کنم مثلا
dev(f(x),h,x);

یوسف زالی
شنبه 21 خرداد 1390, 14:31 عصر
برای اون هم یه تابع بگذار:


float eval(x, h)
{
fx = f(1/(x*x+1)
.
.

}

NIMA_1981
شنبه 21 خرداد 1390, 14:49 عصر
ببن دوست من اگه من اول مفدار ها رو محاسبه کنم و بعد به تابع بدم اشتباه حساب میشه اینجوری میشه که جوابش برابر با ۱ میشه
http://031.img98.net/out.php/i393987_55.png

باید برای تابع اول به این شکل حساب بشه که حواب برابر با ۵ میشه
http://031.img98.net/out.php/i393712_33.png

با تشکر

یوسف زالی
شنبه 21 خرداد 1390, 15:04 عصر
نه دیگه
شما f(x + h) //tabe به اشتباه f(x) + h رو گذاشتید

NIMA_1981
شنبه 21 خرداد 1390, 15:05 عصر
ببنید میشه بگید گه چه طوری میتونم عبارت جبری رو توی برنامه محاسبه کنم مثلا همین عبارت
http://031.img98.net/out.php/i394022_66.png

یوسف زالی
شنبه 21 خرداد 1390, 15:08 عصر
f(x+h) // tabe رو بدید.
شما f(x)// tabe رو با h جمع کنید.

NIMA_1981
شنبه 21 خرداد 1390, 15:42 عصر
f(x+h) // tabe رو بدید.
شما f(x)// tabe رو با h جمع کنید.
من متوجه نشدم مشه واضح تر بگی

مرسی

یوسف زالی
شنبه 21 خرداد 1390, 15:52 عصر
f(x + h) = (2.5 + 0.01)^2 -1
f(x - h) = (2.5 - 0.01)^2 -1
شما این کارو کردی:
f(x + h) = (2.5^2 -1) + 0.01

NIMA_1981
شنبه 21 خرداد 1390, 16:33 عصر
خوب حالا برنامه رو جطوری بنوسیم که واسه هر دو تا تابع درست کار کنه -یعنی یک فرمول اصلی دارم که وقتی هر کدوم از این توابع توش قرار میگره جوابشو حساب کنه

یوسف زالی
یک شنبه 22 خرداد 1390, 08:39 صبح
گفتم دیگه.
تابع اول f رو برای x محاسبه می کنه.حالا x میتونه مقدار x + h باشه یا هر چیزی
دومی x , h میگیره و محاسبه می کنه.
eval(x, h) // mohasebe ba x va h
حالا تو evla جای x میتونی x+h یا x-h پاس بدی به f.

NIMA_1981
یک شنبه 22 خرداد 1390, 10:01 صبح
دوست عزیز میشه زخمت بکشی واسه همون اولی یک کد بنویسی به من بدی -خیلی به این کد احتیاج دارم
مرسی

یوسف زالی
یک شنبه 22 خرداد 1390, 11:47 صبح
#include "StdIO.h"
float F(float x);
float Eval(float x, float h);
void main()
{
printf("\n%10.5f\n", Eval(2.5, 0.01));
getch();
}
float F(float x)
{
return x * x -1;
}
float Eval(float x, float h)
{
return (F(x +h) - F(x -h)) / (2 * h);
}

NIMA_1981
یک شنبه 22 خرداد 1390, 12:17 عصر
دستتون درد نکنه واقعا کمک کردید فقط یه سوال الان تابغ Eval مقدار x,h رو می گیره میشه این رو بشکلی نوشت که مقدار f(x) هم ارسال بشه یعنی Eval با ۳ تا آرگومان باشه که یک دونه تابع Eval داشته باشیم

یوسف زالی
یک شنبه 22 خرداد 1390, 12:52 عصر
همین الان هم یه eval داریم.
اون f خود تابع رو محاسبه می کنه.
می شه کاری که میگید کرد اما کدش طولانی تر میشه و بهینه نیست.

NIMA_1981
یک شنبه 22 خرداد 1390, 12:58 عصر
اره الان Eval یکی هست اما وقتی واسه اون یکی تابع را بخوام حساب کنم باید یک Eval دسگه هم بسازم
واسه این


float F1(float x){
return 1/(x*x+1);
}


من باید یک تابع با ۳ آرگومان بسازم

یوسف زالی
یک شنبه 22 خرداد 1390, 13:05 عصر
float Eval(float x, float h, int i)
{
if (i == 1)
return (F1(x +h) - F1(x -h)) / (2 * h);
else
return (F2(x +h) - F2(x -h)) / (2 * h);
}



با i انتخاب کن کدوم تابع مد نظرتونه

یه کار بهتر. به این دست نزن و f رو اصلاح کن:


float f(float x, int mode)
{
if (mode == 1)
return x*x -1;
else
return 1 / (x*x -1)
}

NIMA_1981
یک شنبه 22 خرداد 1390, 13:18 عصر
کلا روشی وجود نداره که f(x) به تابع پاس داده بشه ؟

یوسف زالی
یک شنبه 22 خرداد 1390, 13:23 عصر
چرا.یه متغیر اضافه کنید از نوع float.
eval(float fx, float x, float h) // fx az tabe e f miad
فراخوانی:
evla(f(x), x, h) // meghdare f be ezaye x mire jaye fx eval

NIMA_1981
یک شنبه 22 خرداد 1390, 13:52 عصر
اینجا (f(x مقداری برای x هنوز در نظر گرفته نشده چون در همین لحظه داره ارسال میشه بعد ازکجا میفهمه که تابعf1 یا f2 را باید محاسبه کنه

یوسف زالی
یک شنبه 22 خرداد 1390, 14:02 عصر
راستش من میخواستم فقط در حد راهنمایی باشه.
شما Fx رو میتونی با شرط گذاشتن f1 یا f2 انتخاب کنی.

F(x) // tabe
if mode == 1 return mohasebeye tabe e evval
else return mohasebeye tabe e dovvom

استفاده:
eval(f(x, 1), x, h) // Fx tabe
یا
eval(f(x, 2), x, h) // Fx tabe

اینجا رو هم لازم نیست قبلش f رو محاسبه کنیم.
هردوش رو خودش محاسبه می کنه.
امیدوارم توضیحم کافی بوده باشه.