আনুমানিক আরকসিন


9

লক্ষ্যটি সহজ: অল্প সংখ্যক বাইটে ইনপুট দেওয়া xসমীকরণের একটি ননজারো আসল সমাধান আউটপুট sin(x) = -mxকরুন m

বিশেষ উল্লেখ:

  • আপনার উত্তরটি অবশ্যই 3 টি গুরুত্বপূর্ণ ব্যক্তির কাছে সঠিক হতে হবে।
  • আপনি তুচ্ছ সমাধান ছাড়া অন্য কোনও আসল সমাধান আউটপুট করতে পারেন x=0। আপনি ধরে নিতে পারেন mএটি এমন যে কমপক্ষে একটি সমাধান বিদ্যমান। আপনিও ধরে নিতে পারেন m!=0

গ্রেডিয়েন্ট বংশদ্ভুত ব্যবহার করে একটি সুস্পষ্টভাবে সাবঅপটিমাল অজগর সমাধান :

from math import *
from random import *
a=x=0.001
m = 5.
def dE(x):return 2*(sin(x)+m*x+1)*(cos(x)+m)
for i in xrange(1000): x-=dE(x)*a
print x

পরীক্ষার মামলা

-0.25 -> ±2.4746
-0.1  -> ±2.8523 or ±7.0682 or ±8.4232
 0.2  -> ±4.1046 or ±4.9063 

1
এখানে সর্বোত্তম পদ্ধতির একটি নির্দিষ্ট মান মুদ্রণ করা হয়, যদিও আপনাকে কত দশমিক স্থানের প্রয়োজন তা নির্দিষ্ট করা উচিত। আমি একটি ইনপুট প্যারামিটার সহ করার সুপারিশ করছি, aসমাধানের জন্য sin(x)=-ax। অনুগ্রহ করে "আপনাকে অবশ্যই এটি গণনা করতে হবে" বলবেন না, কারণ এর মতো প্রয়োজনীয়তাগুলি কাজ করা খুব অস্পষ্ট।
xnor

এছাড়াও, x=0একটি তুচ্ছ সমাধান। আপনি কোন সমাধান চান তা নির্দিষ্ট করা উচিত।
xnor

ননজারো সমাধানের গ্যারান্টি দিতে আপনার কিছুটা সীমার দরকার আছে।
xnor

m=0সমাধান আছে ( x=kπপূর্ণসংখ্যার জন্য k)। যার মানগুলিতে mঅ-তুচ্ছ সত্যিকারের সমাধান নেই সেগুলি হ'ল এটি অনেক দূরের 0
পিটার টেলর

1
আপনি কি কেবল আসল-মূল্যবান সমাধানের সন্ধান করছেন বা জটিল-মূল্যবান সমাধানগুলিও অনুমোদিত?
মাইল

উত্তর:


1

ised : 32 28 বাইট

নিউটনের পুনরাবৃত্তিটি π থেকে শুরু করে:

{:x-{sinx+$1*x}/{cosx+$1}:}:::pi

যুক্তিটি পাস করা হয়েছে $1, যা কোনও ফাইল থেকে নেওয়া যেতে পারে:

ised --l inputfile.txt 'code'

কিছুটা কম স্থিতিশীল তবে সংক্ষিপ্ত সংস্করণ:

{:{x-tanx}/{1+$1/cosx}:}:::pi

কখনও কখনও এটি পুনরাবৃত্তি সীমা সতর্কতা নিক্ষেপ করে তবে শর্তগুলি বিবেচনা করে যথার্থতা ঠিক মনে হয়।

ইউনিকোড সংস্করণ (একই বাইকাউন্ট):

{λ{x-tanx}/{1+$1/cosx}}∙π

4 থেকে শুরু করে আরেকটি বাইট কাটা এবং একই মানগুলিতে রূপান্তরিত হয় বলে মনে হয়

{λ{x-tanx}/{1+$1/cosx}}∙4

8

হাস্কেল, 34 বাইট

f m=until(\x->sin x< -m*x)(+1e-3)0

x0 থেকে 0.001 অবধি গণনা করা হয় sin(x)< -m*x

Ouput উদাহরণ

f -0.2 ->   2.595999999999825
f -0.1 ->   2.852999999999797
f  0.0 ->   3.141999999999765
f  0.1 ->   3.4999999999997256
f  0.2 ->   4.1049999999997056

কি হবে m=-0.1?
পিটার টেলর

@ পিটারটেলর নোট করুন এটির প্রয়োজন কিনা তা নিশ্চিত করুন তবে এটি দেয় 2.853যা সঠিক দেখাচ্ছে।
xnor

অবশ্যই, তারা উভয়ই স্বতন্ত্র ফাংশন তাই কোনও সমাধান থাকলে যদি ইতিবাচক সমাধান হয়। ডোহ।
পিটার টেলর

আপনি কেন এমন চ্যালেঞ্জটির উত্তর দেবেন যেটি আপনি জানেন না তা অস্পষ্ট?
মেগো

2

গণিত, 28 বাইট

x/.FindRoot[Sinc@x+#,{x,1}]&

প্রাথমিক অনুমান থেকে সংখ্যার মূল অনুসন্ধান করে x=1। পরীক্ষার কেস:

% /@ {-0.25, -0.1, 0.2}
(* {2.47458, 2.85234, 4.10462} *)

1

সি, 99 বাইট

#include<math.h>
float f(float m){float x=1,y;do{x=(y=sin(x)+m*x)+x;}while(fabs(y)>1e-4);return x;}

ungolfed:

#include<math.h>
float f(float m){
 float x=1,y;
 do{x=(y=sin(x)+m*x)+x;}while(fabs(y)>1e-4);
 return x;
}

1

এমএটিএল , 17 বাইট

`@2e3/tY,wG_*>}4M

এটি ইতিবাচক বাস্তব অক্ষরে রৈখিক অনুসন্ধান ব্যবহার করে, তাই এটি ধীর হয়। সমস্ত পরীক্ষার কেসগুলি অনলাইন সংকলকটিতে 1 মিনিটের মধ্যে শেষ হয়।

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

`         % Do...while
  @       %   Push iteration index, starting at 1
  2e3/    %   Divide by 2000
  t       %   Duplicate
  Y,      %   Sine
  w       %   Swap
  G_*     %   Multiply by minus the input
  >       %   Does the sine exceed that? If so, next iteration
}         % Finally (execute after last iteration, before exiting loop)
   4M     %   Push input of sine function again
          % Implicit end
          % Implicit display

1

সি ++ 11, 92 91 বাইট

ব্যবহারের জন্য -1 বাইট #import

#import<cmath>
using F=float;F f(F m,F x=1){F y=sin(x)+m*x;return fabs(y)>1e-4?f(m,x+y):x;}

0

পাইথন 2, 81 78 বাইট

ফিক্সপয়েন্ট পুনরাবৃত্তি

পুনরাবৃত্ত লাম্বদা হিসাবে

from math import*
f=lambda m,x=1:abs(sin(x)+m*x)>1e-4and f(m,sin(x)+m*x+x)or x

লুপ হিসাবে (81 বাইট):

from math import*
m=input()
x=1
while abs(sin(x)+m*x)>1e-4:x=sin(x)+m*x+x
print x

0

গণিত, 52 বাইট

NSolve[Sin@x==-x#,x,Reals][[;;,1,2]]~DeleteCases~0.&

বেনামে ফাংশন। ইনপুট হিসাবে একটি সংখ্যা নেয় এবং আউটপুট হিসাবে সংখ্যার একটি তালিকা প্রদান করে। NSolveআনুমানিক সমীকরণ সমাধান করতে কেবল ব্যবহার করে।


আপনি প্রতিস্থাপন Sin@x==-x#সঙ্গে Sinc@x==-#তোমাদেরকে বিলুপ্তিতে নিয়ে যাবেন করতে~DeleteCases~0.

0

অ্যাক্সিয়োম, 364 বাইট

bisezione(f,a,b)==(fa:=f(a);fb:=f(b);a>b or fa*fb>0=>"fail";e:=1/(10**(digits()-3));x1:=a;v:=x2:=b;i:=1;y:=f(v);if(abs(y)>e)then repeat(t:=(x2-x1)/2.0;v:=x1+t;y:=f(v);i:=i+1;if i>999 or t<=e or abs(y)<e then break;if fb*y<0 then(x1:=v;fa:=y)else if fa*y<0 then(x2:=v;fb:=y)else break);i>999 or abs(y)>e=>"fail";v)
macro g(m) == bisezione(x+->(sin(x)+m*x), 0.1, 4.3)

ungolf

bisezione(f,a,b)==
    fa:=f(a);fb:=f(b)
    a>b or fa*fb>0=>"fail"
    e:=1/(10**(digits()-3))
    x1:=a;v:=x2:=b;i:=1;y:=f(v)
    if(abs(y)>e) then
      repeat
        t:=(x2-x1)/2.0;v:=x1+t;y:=f(v);i:=i+1
        if i>999 or t<=e or abs(y)<e then break
        if      fb*y<0 then(x1:=v;fa:=y)
        else if fa*y<0 then(x2:=v;fb:=y)
        else break
    i>999 or abs(y)>e=>"fail"
    v

macro g(m) == bisezione(x+->(sin(x)+m*x), 0.1, 4.3)

ফলাফল

(3) -> g(0.2)
   AXIOM will attempt to step through and interpret the code.
   (3)  4.1046198505 579058527
                                                              Type: Float
(4) -> g(-0.1)
   (4)  2.8523418944 500916556
                                                              Type: Float
(5) -> g(-0.25)
   (5)  2.4745767873 698290098
                                                              Type: Float

0

হাস্কেল, 50 বাইট

আমি আমার ক্যালক ক্লাসে নিউটনের পদ্ধতি সম্পর্কে শিখেছি, সুতরাং এখানে haskellনিউটনের পদ্ধতিটি ব্যবহার করা যায় ।

f m=foldl(\x _->x-(sin x+m*x)/(cos x+m))0[1..10]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.