حل معادله به صورت عددی
سلام
یه اپلیکیشن نوشتم که در یک قسمتش نیاز است یه معادله مثلثاتی و یک معادله چند جمله ای را حل کند(همه متغیر ها به جز یکی از آن ها از کاربر گرفته میشه و برنامه باید متغیر مجهول را محاسبه کند)
معادله ها هم مشخص و ثابت هست و فقط باید همین معادله ها(5 معادله) حل شود.
معادله های مورد نظر در این دو عکس است:
http://s8.picofile.com/file/8280762418/equ1.jpg
http://s9.picofile.com/file/8280762450/equ2.jpg
در معادله های چند جمله ای باید y را به دست آورد و در معادله های مثلثاتی، θ را باید به دست آورد.
نیاز نیست معادله ها به صورت پارامتری حل شوند به دلیل این که تمام مقادیر مجهول (به جز y و θ) از کاربر دریافت می شود، پس معادلات به صورت عددی حل می شوند.
ممنون میشم راهنمایی کنید.
همه معادله هایی که در سوال بالا مطرح کردم را توانستم حل کنم (با روش نیوتن - رافسون) ولی معادلات مثلثاتی را نتوانستم!
یعنی برای آن ها هم الگوریتم نیوتن - رافسون را نوشتم ولی جواب مورد نظر من را نمیدهد و جواب اشتباهی را در خروجی بر میگرداند.
باید جوابی که در تصویر مشاهده می کنید را برگرداند ولی صفر را بر میگرداند.
کدی که استفاده کردم:
import static java.lang.Math.*;
public class MainActivity extends AppCompatActivity {
double d=2, g=9.81, Q=2.5;
double teta = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView res = (TextView) findViewById(R.id.res);
double result = NewtonRaphson(1);
Log.i("final result in radian",""+result);
result = toDegrees(result);
Log.i("final result in degrees",""+result);
String res1 = ""+result;
res.setText(res1);
}
double NewtonRaphson (double x_0){
double xLast = 0;
double xNew = 0;
xLast = 1;
int count = 0;
while (count < 10){
xLast = toRadians(xLast);
xNew = xLast - (f(xLast)/f_prime(xLast));
Log.i("f(xLast)",""+f(xLast));
Log.i("f_prime(xLast)",""+f_prime(xLast));
Log.i("f(xLast)/f_prime(xLast)",""+f(xLast)/f_prime(xLast));
Log.i("xNew in radian",""+xNew);
xLast = xNew;
count++;
}
return xNew;
}
double f(double x){
return pow((0.125d*(x-sin(x))*pow(d,2)),3)*g-(pow(Q,2)*d*sin(x/2d));
}
double f_prime(double x){
return ((3*0.125d*pow(d,2)*(1-cos(x)))*(pow((0.125d*(x-sin(x))*pow(d,2)),2)))*g-(0.5d*pow(Q,2)*d*cos(x/2d));
}
}
این معادله را باید با چه الگوریتمی حل کنم؟، بسط تیلور؟ و اگر جواب بسط تیلور است به چه صورت باید این بسط را برای این معادله استفاده کنم؟
با تشکر
برای این نوع توابع هم روش نیوتن رافسون معتبر است و البته در حال حاضر درست عمل می کند (چون 0 = θ نیز ریشه ی معادله هست) اما برای این که به پاسخ دلخواه برسید چند مورد زیر را انجام دهید :
1 ) بین متغیر و عدد حتماً علامت ضرب را قرار دهید به طور مثال (2d => 2*d)
2) به جای تابع مشتق حساب شده عبارت ساده شده ی آن را قرار دهید (عبارت زیر)

3 ) نقطه ی اولیه ای که به الگوریتم نیوتن رافسون می دهید را در حد امکان از صفر دور کنید.
4 ) در صورتی که راه های بالا جواب نداد از روش تنصیف و یا نابه جایی در بازه ای استفاده کنید که صفر در آن نباشد.
سلام
در مورد روش نوشتن کد نظری ندارم ولی یه مشکل دیدم تویه کدتون گفتم بگم شاید کدتون درست بشه
شما باید درون توابع مثلثاتی رو به رادیان تبدیل کنید شاید مشکل از این باشه
به طور مثال:
Math.sin(Math.toRadians(angle))
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
