グラフ化することによって視覚的にわかり易くなり、実数解が存在するか程度ならすぐに分かります。
ではひとまず定義。

これが表示用の関数です。
ウィンドウの大きさは480*480で、うち上下左右40pxは空白部とします。
また、数値解析における分割数は100分割で、400px内を100分割して直線で結ぶ感じです。
つまり4pxは直線だけど大きい目で見たら曲線に見えるよね、って感じかな。
線を引くためには始点と終点が必要になりますが、終点は現在の計算点、始点は前回の計算点とします。
0→1、1→2、2→3点という風になります。
以下プログラムリスト。
Linuxの人はindentコマンドで整形するなりなんなりしてくだされ。
ちなみにindentコマンドは
sudo apt-get install indent
より
indent FILENAME -OPTION
で使えます。
OPTIONは-krをつかうと幸せ。
こんな感じになります。

以下リスト。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<X11/Xlib.h>
#include<X11/Xutil.h>
#define X_MAX 400
#define Y_MAX 400
#define X_EDGE 40
#define Y_EDGE 40
#define I_MAX 100
void x_axis();
void y_axis();
void figure();
float func(float x);
int main(int argc,char **argv){
Display *display;
Window window;
XEvent event;
KeySym key;
GC gc;
char ch;
display = XOpenDisplay(NULL);
window = XCreateSimpleWindow(display,RootWindow(display,0),0,0,X_MAX + X_EDGE * 2,Y_MAX + Y_EDGE * 2,1,BlackPixel(display,0),WhitePixel(display,0));
XSelectInput(display,window,ExposureMask | ButtonPressMask | KeyPressMask);
XStoreName(display,window,argv[0]);
XMapWindow(display,window);
gc = DefaultGC(display,0);
while(1){
XNextEvent(display,&event);
if(event.type == Expose){
x_axis(display,window,gc);
y_axis(display,window,gc);
figure(display,window,gc);
}
if(event.type == ButtonPress){
if(event.xbutton.button == Button3){
XCloseDisplay(display);
break;
}
}
if(event.type == KeyPress){
if(XLookupString(&event.xkey,&ch,1,&key,NULL) == True){
if(ch == '\03'){
XCloseDisplay(display);
break;
}
}
}
}
}
void x_axis(Display *display,Window window,GC gc){
int xtmp0,ytmp0,xtmp1,ytmp1;
xtmp0 = X_EDGE;
ytmp0 = Y_EDGE + Y_MAX / 2;
xtmp1 = X_EDGE + X_MAX;
ytmp1 = ytmp0;
XDrawLine(display,window,gc,xtmp0,ytmp0,xtmp1,ytmp1);
}
void y_axis(Display *display,Window window,GC gc){
int xtmp0,ytmp0,xtmp1,ytmp1;
xtmp0 = X_EDGE + X_MAX / 2;
ytmp0 = Y_EDGE;
xtmp1 = xtmp0;
ytmp1 = Y_EDGE + Y_MAX;
XDrawLine(display,window,gc,xtmp0,ytmp0,xtmp1,ytmp1);
}
void figure(Display *display,Window window,GC gc){
int i;
float p_old,q_old,p_new,q_new;
int x_old,y_old,x_new,y_new;
int x_center,y_center;
x_center = X_EDGE + X_MAX / 2;
y_center = Y_EDGE + Y_MAX / 2;
for(i = 0;i < I_MAX -1;i++){//
p_old = - 5.0 + 10.0 * (float)i / (float)I_MAX;
q_old = func(p_old);
p_new = - 5.0 + 10.0 * (float)(i + 1) / (float)I_MAX;
q_new = func(p_new);
x_old = x_center + (int)(p_old * (float)X_MAX / 10.0);
y_old = y_center - (int)(q_old * (float)Y_MAX / 10.0);
x_new = x_center + (int)(p_new * (float)X_MAX / 10.0);
y_new = y_center - (int)(q_new * (float)Y_MAX / 10.0);
if((q_old > -5.0) && (q_old < 5.0) && (q_new > -5.0) && (q_new < 5.0)){
XDrawLine(display,window,gc,x_old,y_old,x_new,y_new);
}
}
}
float func(float x){
float value;
value = 0.5 * x * x * x + 0.75 * x * x - 2.0 * x - 2.0;
return value;
}
0 件のコメント:
コメントを投稿