-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmethod-secant.php
173 lines (173 loc) · 9.8 KB
/
method-secant.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
<!doctype html>
<html dir="rtl" lang="fa-IR">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="numerical-analysis.css">
<script src="numerical-analysis.js"></script>
</head>
<body style="direction: rtl;">
<div class="header"><video width="80" height="80" autoplay loop muted><source src="https://rezasadid.com/files/data/rs-logo-long.mp4" type="video/mp4" />Reza Sadid</video></div>
<div class="page"><a class="button fa back" href="https://rezasadid.com/projects/numericalanalysis/">→ بازگشت به فهرست</a><div>
<h1 class="fa">ریشه یابی - روش وتری</h1>
<p>
با وارد کردن تابع مورد نظر و دو مقدار اولیه دلخواه، یکی از ریشههای آن با استفاده از روش وتری محاسبه میشود. تکرارها تا زمانی که 7 رقم بامعنا پاسخ ثابت بماند ادامه مییابد و در نهایت ریشه تابع با تقریب بدست میآید. در صورت تمایل میتوانید تابع دلخواه خود را در فرم وارد کنید یا با کلیک بر روی دکمه پایین فرم، از یک تابع پیشفرض برای محاسبات استفاده کنید.
</p>
<div class="message">برای مشاهده پاسخ اسکرول کنید</div>
<form id="mainform" method="post" action="">
<div class="inp">
<input type="text" name="function" id="v1">
<label onclick="focusinp('v1')" for="v1">تابع</label>
</div>
<div class="inp">
<input type="text" name="a" id="v2">
<label onclick="focusinp('v2')" for="v2">مقدار اولیه اول</label>
</div>
<div class="inp">
<input type="text" name="b" id="v3">
<label onclick="focusinp('v3')" for="v3">مقدار اولیه دوم</label>
</div>
<button type="submit">ثبت</button>
</form>
<div class="separator"><div class="line"></div><p>یا</p><div class="line"></div></div>
<button type="button" onclick="methodsecant()">محاسبه ریشه تابع <code>(2x+5)*sin(x)+5</code> با مقادیر اولیه 3 و 4</button>
<div class="help">
<span>راهنما</span>
در وارد کردن تابع توجه کنید که برای اپراتور جمع از + و برای اپراتور تفریق از - و برای اپراتور ضرب از * و برای اپراتور تقسیم از / و برای اپراتور توان از ** استفاده نمائید، همچنین میتواند از توابع مثلثاتی مانند سینوس و کسینوس و تانژانت و سینوس هیپربولیک و کسینوس هیپربولیک نیز استفاده کنید که به ترتیب در قالب
<code>sin(تابع مدنظر)</code>
و
<code>cos(تابع مدنظر)</code>
و
<code>tan(تابع مدنظر)</code>
و
<code>sinh(تابع مدنظر)</code>
و
<code>cosh(تابع مدنظر)</code>
باید وارد شوند. برای وارد کردن رادیکال از قالب
<code>sqrt(تابع مدنظر)</code>
و برای لگاریتم از قالب
<code>log(تابع مدنظر,پایه لگاریتم)</code>
استفاده نمائید. در وارد کردن تابع توجه نمائید که اپراتور ضرب را حتما بین ارقام و متغیر ها درج نمائید برای مثال بجای عبارت
<code>2x</code>
یا
<code>2sin(x)</code>
باید
<code>2*x</code>
یا
<code>2*sin(x)</code>
نوشته شود تا تابع پس از ترجمه مطابق با سینتکس پی اچ پی باشد. درصورتی که پس از ثبت تابع روند تکرار نمایش داده نشد تابع خود را تصحیح کنید و یا از دکمه پایین آن استفاده نمائید که بمنظور سهولت روند تست تابعی پیشفرض با کلیک بر روی آن در فرم قرار میگیرد و میتوانید روند محاسبات را مشاهده نمائید.
</div>
<div class="log">
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
echo '<style>.log, .message { display: flex; }</style>';
$function = $_POST["function"];
$a = $_POST["a"];
$b = $_POST["b"];
echo 'مقادیر اولیه وارد شده: ' . $a . ' و ' . $b . '<hr>';
echo 'تابع وارد شده: <code>' . $function . '</code><hr>';
$function = str_replace(' ', '', $function);
function convert($input) {
$output = '';
for ($i = 0; $i < strlen($input); $i++) {
$char = $input[$i];
if ($i !== strlen($input)) {
$nextchar = $input[$i + 1];
} else {
$nextchar = null;
}
if ($i !== 0) {
$prechar = $input[$i - 1];
} else {
$prechar = null;
}
if ($char == '(') {
if ($prechar == 'x' || is_numeric($prechar)) {
$addoperator = ' *';
} else {
$addoperator = null;
}
} else if ($char == ')') {
if ($nextchar == '(' || is_numeric($nextchar) || ctype_alpha($nextchar)) {
$addoperator = '* ';
} else {
$addoperator = null;
}
}
if ($nextchar !== null && $prechar !== null) {
if ($char == '*' || $char == '/' || $char == '+' || $char == '-' || $char == '(' || $char == ')') {
if ($char == '(') {
if ($prechar !== 'x' && ctype_alpha($prechar)) {
$output .= $char . ' ';
} else {
$output .= $addoperator . ' ' . $char . ' ';
}
} else if ($char == ')') {
$output .= ' ' . $char . ' ' . $addoperator;
} else if ($char == '*' && $nextchar == '*') {
$output .= ' ' . $char;
} else if ($char == '*' && $prechar == '*') {
$output .= $char . ' ';
} else {
$output .= ' ' . $char . ' ';
}
} else if ($char == 'x' && is_numeric($prechar)) {
$output .= ' * ' . $char;
} else {
$output .= $char;
}
} else {
$output .= $char;
}
}
return $output;
}
$function = convert($function);
$function = str_replace('x', '$x', $function);
echo 'تابع ترجمه شده: <code>' . $function . '</code>';
function f($x)
{
global $function;
return eval("return $function;");
}
$m = 0;
$x = 0;
$stop = false;
while ($m < 100) {
echo '<hr> تکرار شماره ' . $m . '<code>a=' . $a . ', b=' . $b . ', f(a)=' . f($a) . ', f(b)=' . f($b) . '</code>';
$oldx = $x;
$x = $a - ((f($a) * ($b - $a)) / (f($b) - f($a)));
if (f($a) * f($x) < 0) {
$b = $x;
echo 'پاسخ محاسبه شده: ' . $x;
} else if (f($b) * f($x) < 0) {
$a = $x;
echo 'پاسخ محاسبه شده: ' . $x;
} else {
$stop = true;
echo 'پاسخ محاسبه شده: ' . $x;
}
$delta = abs($x - $oldx) / abs($x);
if ($delta < pow(10, -7)) {
$stop = true;
}
if ($stop) {
break;
}
$oldx = $x;
$m++;
}
}
?>
</div>
</div><div class="footer">طراحی و توسعه داده شده توسط رضا سدید<a href="mailto:contact@rezasadid.com" style="min-width: calc(100% - 325px); text-align: left;">contact@rezasadid.com</a><a href="tel:02191302492">021-91302492</a></div>
</div>
<div class="pic">
<img src="https://rezasadid.com/files/data/pattern-background.gif" alt="background" loop=infinite/><div></div>
</div>
<div class="msg">
ریشه یابی - روش وتری
</div>
<h1 class="fa main">Numerical Analysis</h1>
</body>
</html>